在我的应用程序中,我想要一个轮询循环,它会阻止套接字接收操作,但会在 100 毫秒后超时。这将允许我在需要时退出循环(例如,用户单击 UI 中的某些内容),同时避免使用繁忙循环或 Thread.sleep。
但是,似乎一旦打开 .NET 套接字,它只能超时一次。在第一次超时之后,任何会阻塞的调用都会立即抛出异常。
根据这个问题,“你不能超时或取消异步Socket
操作。” 为什么不?有没有更好的方法来解决 .NET 世界中的问题?
要在 .NET 套接字上编写非忙轮询循环,可以使用 Poll 套接字方法,如下所示:
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。