我正在使用
await stream.AuthenticateAsServerAsync(serverCert, true, SslProtocols.Tls, false);
在我的应用程序中保护连接。
不幸的是,在极少数情况下(大约1000个中的一个),这完全挂起。
我尝试在较低级别NetworkStream
和TcpClient
设置超时。
但没有任何作用,这些联系随着时间的推移不断累积。
由它完全挂起我的意思是它被困在那里好几天(如果应用程序运行那么久)。
我目前用肮脏的黑客解决了这个问题。我开始一个新线程,在其中等待5秒,如果调用没有及时返回,我调用tcpClient.Close()
强制SslStream中止。
这是什么问题? 一般情况下,处理函数超时但是没有需要TimeSpan或CancellationToken的重载时,处理这种情况的方法是什么?
tcpClient上的较低级别超时是否至少抛出异常?为什么不发生这种情况?
答案 0 :(得分:0)
似乎所有网络相关内容的异步版本都不支持超时。 这就是为什么AuthenticateAsServerAsync也不支持超时。
来自文档:
请注意
此属性仅影响通过调用Read方法执行的同步读取。此属性不会影响通过调用BeginRead方法执行的异步读取。
在我启动AuthenticateAsServerAsync(...)之前,我首先启动我自己的任务延迟。
Task.Run(async() {
await Task.Delay(TimeSpan.FromMinutes(1));
tcpClient.Close();
});
如果有人有更好的方法,请告诉我:)