.NET:如何在读取超时后继续使用套接字?

时间:2012-05-14 21:20:29

标签: sockets timeout

在我的应用程序中,我希望有一个轮询循环,它阻塞套接字接收操作但在100毫秒后超时。这将允许我在我想要的时候退出循环(例如用户点击UI中的内容),同时避免使用繁忙的循环或Thread.sleep。

然而,似乎一旦打开.NET套接字,它只能超时一次。在第一次超时之后,任何会阻止立即抛出异常的调用。

根据this question,“您无法超时或取消异步Socket操作。”为什么不?有没有更好的方法来解决.NET世界中的问题?

1 个答案:

答案 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。