2012-06-07 42 views
5

基於問題數量,論壇帖子等,BCL中的TcpClient/NetworkStream實現似乎沒有像樣的支持取消IO操作。隨着.NET 4.5中的異步方法的增加,這種缺乏取消(或體面的超時支持)使事情變得更加令人沮喪,因爲在執行IO時,取消拒絕監視其CancellationToken的任務變得更加複雜(幾乎不可能) 。支持異步操作並尊重超時的.NET TcpClient/NetworkStream實現

我見過很多實現,如果事情似乎出錯了,可以啓動其他線程來監視網絡操作並關閉底層流。在我們試圖通過使用異步操作來節省這些資源的世界中​​,這感覺非常骯髒。

任何人都可以指導我如何有效地取消/超時網絡IO操作或實現可靠的第三方實現?

回答

4

取消IO不是微不足道的。從Vista開始,我們擁有CancelIO功能,但這是一個相當新的事物,驅動程序需要支持它。

實際上,你所能做的最好的就是關閉套接字來取消一切。或者,您可以在任務設置爲CancellationToken時提供即時完成的任務周圍實現包裝函數。 IO操作仍將繼續,但其結果將被丟棄。

下面是對這個問題進行深入討論:http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

我想CancelIo/CancelIoEx是OS級的功能,而不是依靠那些驅動程序來實現/支持他們? – Andrew

+0

它們是調用通過驅動程序調用的kernes的Win32 API。如果您取消了大量讀取,則驅動程序需要通過告訴磁盤停止進行合作。 CancelIO具有物理效果。 – usr

+2

謝謝你推動我朝這個方向發展。我認爲CancelIo/CancelIoEx是操作系統級別的,並且不需要驅動程序級別的支持。在做了更多的研究之後,我發現了這篇文章(不知道我以前是怎麼錯過的),討論了取消異步IO的挑戰。看起來,基於文件的IO是在線檢修,但網絡不是。 http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew

相關問題