在我的应用程序中,我希望有一个轮询循环,它阻塞套接字接收操作但在100毫秒后超时。这将允许我在我想要的时候退出循环(例如用户点击UI中的内容),同时避免使用繁忙的循环或Thread.sleep。
然而,似乎一旦打开.NET套接字,它只能超时一次。在第一次超时之后,任何会阻止立即抛出异常的调用。
根据this question,“您无法超时或取消异步Socket
操作。”为什么不?有没有更好的方法来解决.NET世界中的问题?
答案 0 :(得分:0)
要在.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。