在我的应用程序中,我想有一个轮询循环,该循环阻止套接字接收操作,但在 100 毫秒后超时。这将允许我在需要时退出循环(例如,用户单击UI中的某些内容(,同时避免使用繁忙循环或Thread.sleep。
但是,似乎一旦打开了 .NET 套接字,它就只能超时一次。第一次超时后,任何会阻止的调用都会立即引发异常。
根据此问题,"您无法超时或取消异步Socket
操作。为什么不呢?在 .NET 世界中,是否有更好的方法来解决这个问题?
若要在 .NET 套接字上编写非繁忙轮询循环,可以使用轮询套接字方法,如下所示:
for (keepGoing) {
if (mySocket.Poll(1000 * timeout_milliseconds, SelectMode.SelectRead)) {
// Assert: mySocket.Available > 0.
// TODO: Call mySocket.Receive or a related method
}
}
在这种情况下,如果在指定的超时内没有数据可供从套接字读取,则Poll
返回 false。如果另一个线程想要完全关闭轮询循环,则可以将keepGoing
重置为 false。