gpt4 book ai didi

c# - 如何正确使用 TcpClient ReadTimeout

转载 作者:IT王子 更新时间:2023-10-29 04:17:12 26 4
gpt4 key购买 nike

在为这个简单问题找到答案所花费的时间似乎比合理的多得多之后,我想我应该将我的结果留在这里,这样其他人就不必跳过我刚刚遵循的所有障碍和错误路径。

问题是,如果您使用 TcpClient ReadTimeout 属性并且您的读取操作实际超时,Microsoft 决定关闭套接字。这是不期望的,不可取的,我所知道的任何其他套接字实现都没有这样做,并且除了程序员懒惰之外没有正当理由应该是这种情况。但这就是微软选择做的事情。

无论如何,我发现的所有变通办法,包括在这个网站上,都有各种方法来进行某种形式的繁忙轮询,有些甚至涉及启动另一个线程来执行简单的读取调用。抱歉,我的 CPU 有更好的事情要做,而不是坐在那里忙于轮询,尤其是在许多套接字打开的情况下,所以这不是我的选择。毕竟,这已经不是 1990 年代早期的事情了,那时忙碌的投票只是你做事的方式。现在,我们有一个叫做操作系统的东西,它使用中断非常有效地处理这些类型的事情。

无论如何,在另一个切线搜索中,我偶然发现了这篇旧博客文章:

http://blogs.msdn.com/b/mflasko/archive/2006/02/20/535655.aspx

MSDN 博客 > Mike Flasko 的博客 > 读取网络数据时处理超时

告诉您如何正确处理读取超时的解决方案的关键要点是:

At this point one may be tempted to catch the exception and then reissue the read on the same NetworkStream. This strategy can lead to unexpected errors. The best thing to do is to now treat the NetworkStream (socket) as being in an unstable state. This is because when the underlying stack times out, the underlying I/O read gets cancelled. If data comes in at the same time, the data will be lost, resulting in a corrupted data stream.

和解决方案:

A better approach is to catch the exception, close the socket or TCPClient and reconnect if necessary.

虽然我仍然认为这给 API 的用户带来了不必要的负担,但至少这是我在查看的数十个站点中找到的最合适的解决方案,试图找出一个半正确的方法套接字读取超时。

我希望这个问题/评论可以节省我寻找的时间。

最佳答案

您正在寻找的是 Poll 或 Select 方法,这些方法允许您在不关闭底层连接的情况下等待超时数据:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.poll%28v=vs.110%29.aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select%28v=vs.110%29.aspx

关于c# - 如何正确使用 TcpClient ReadTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com