【问题标题】:.NET: How can I keep using a socket after a read timeout?.NET:如何在读取超时后继续使用套接字?
【发布时间】:2012-05-22 09:41:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: sockets timeout


    【解决方案1】:

    要在 .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。

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2017-01-17
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      相关资源
      最近更新 更多