似乎无法在.NET AcceptAsync()
类的Socket
方法上指定超时。它接受SocketAsyncEventArgs
if (!socket.AcceptAsync(awaitable.EventArgs))
doasync();
else
dosync();
有关如何在特定时间范围后使此方法超时的任何建议?它似乎也适用于ReceiveAsync()
方法。
Socket
本身有一些超时值,如ReceiveTimeout
,但文档表明它们不适用于异步方法。
答案 0 :(得分:0)
ReceiveTimeout
没有人们想象的那么有用。除此之外,它仅适用于同步Receive()
方法调用,还有一个超时发生后套接字不可用。无法在套接字上进行接收操作超时,然后从同一套接字恢复读取。
因此,无论操作类型如何,总是有效的替代方案都可以。具体做法是:
关闭套接字将导致任何挂起的I / O操作完成异常。当然,关闭套接字后,您将无法再次使用该套接字。但这就是底层套接字API的工作原理,所以这不是问题。
请注意,您的计时器和套接字操作正在竞争。因此,不仅要实现定时器,还要同步操作和定时器,这一点很重要。例如。使用volatile bool
标志表示操作已成功完成,即使调用了计时器处理程序,也不应该关闭套接字。