.NET TcpClient/NetworkStream实现,支持异步操作并考虑超时

And*_*rew 5 .net networkstream tcpclient asyncsocket base-class-library

根据问题数量,论坛帖子等,BCL中的TcpClient/NetworkStream实现似乎缺乏对取消IO操作的良好支持.随着.NET 4.5中Async方法的增加,这种缺少取消(或者不错的超时支持)使得事情变得更加令人沮丧,因为在执行IO时取消拒绝监视其CancellationToken的任务变得更加复杂(几乎不可能) .

我已经看到许多实现启动其他线程来监视网络操作并在事情看起来出错时关闭底层流.在我们试图通过使用异步操作来节省这些资源的世界中​​,这感觉非常脏.

任何人都可以指导我处理有效取消/超时网络IO操作或实际工作的强大第三方实施的指导方向吗?

usr*_*usr 4

取消 IO 并不是一件小事。从 Vista 开始,我们有了 CancelIO 功能,但这是一个相当新的东西,驱动程序需要支持它。

实际上,您能做的最好的事情就是关闭套接字以取消一切。或者,您可以围绕任务实现一个包装函数,该函数可以在设置 CancellationToken 时立即完成。IO 操作仍将继续,但其结果将被丢弃。

这是有关该问题的彻底讨论:http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

  • 感谢您推动我朝这个方向发展。我认为 CancelIo/CancelIoEx 是操作系统级别的,不需要驱动程序级别的支持。在对此进行了更多研究后,我发现了这篇文章(不知道我之前是如何错过的),其中讨论了取消异步 IO 的挑战。看起来基于文件的 IO 即将进行彻底改革,但网络却不然。http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 (2认同)
  • 这个链接很重要,所以我将其放入我的答案中。 (2认同)