根据问题数量,论坛帖子等,BCL中的TcpClient / NetworkStream实现似乎缺乏对取消IO操作的良好支持。随着.NET 4.5中Async方法的增加,这种缺少取消(或者不错的超时支持)使得事情变得更加令人沮丧,因为在执行IO时取消拒绝监视其CancellationToken的任务变得更加复杂(几乎不可能)
我见过许多实现,它们会启动其他线程来监视网络操作,并在事情出现问题时关闭底层流。在我们试图通过使用异步操作来保存这些资源的世界中,这感觉非常脏。
任何人都可以指导我指导有效取消/超时网络IO操作或实现有效的第三方实施吗?
答案 0 :(得分:4)
取消IO并非易事。从Vista开始,我们拥有CancelIO功能,但这是一个相当新的事情,驱动程序需要支持它。
实际上,您可以做的最好就是关闭套接字以取消所有内容。或者,您可以围绕任务实现包装函数,该任务在CancellationToken设置时提供即时完成。 IO操作仍将继续,但其结果将被丢弃。
以下是有关此问题的详尽讨论:http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187