0

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

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

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

4

1 回答 1

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。

于 2012-05-15T14:08:53.080 回答