5

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

我见过许多实现,它们会启动额外的线程来监视网络操作并在出现问题时关闭底层流。在我们试图通过使用异步操作来节省这些资源的世界中​​,这感觉非常肮脏。

任何人都可以向我指出如何有效地取消/超时网络 IO 操作或实现真正有效的强大的第 3 方实施的指导方向吗?

4

1 回答 1

4

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

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

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

于 2012-06-07T10:44:58.743 回答