2012-06-07 11 views
5

質問、フォーラム投稿などの数に基づいて、BCLのTcpClient/NetworkStream実装にはIO操作をキャンセルするための適切なサポートがないようです。 .NET 4.5でAsyncメソッドを追加すると、IOの実行中にCancellationTokenを監視することを拒否するタスクを取り消すことがさらに複雑になりがちです(不可解なタイムアウトサポート) 。非同期操作をサポートし、タイムアウトを考慮した.NET TcpClient/NetworkStreamの実装

私は、ネットワーク操作を監視するために追加のスレッドをスピンアップし、状況が悪くなっているように見える場合は、基本のストリームを閉じる多くの実装を見てきました。これは、非同期操作を使用してこれらのリソースを節約しようとしている世界では、非常に汚いと感じています。

ネットワークI/O操作を効率的にキャンセル/タイムアウトするか、実際に動作する堅牢なサードパーティの実装に対処する方法については、誰でも指導の指針を指摘できますか?

答えて

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がOSレベルで、ドライバーレベルのサポートは必要ないと考えました。これをもう少し研究したところ、私はこの記事を見てきました(私が前にそれを見逃していたかどうかは分かりません)。ファイルベースのIOはオーバーホールを得るために並んでいるが、ネットワーキングはそうではないようだ。 http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew

関連する問題