7

(双方向) NetworkStream を使用した非同期 IO に関連して、MSDNは、「BeginRead を呼び出すたびに、EndRead を 1 回呼び出す必要がある」と述べています。

BeginRead() が発行された後に NetworkStream が閉じられた場合など、EndRead() が例外をスローする場合でも、これは当てはまりますか?

例外のスローのオーバーヘッドは必要ありませんが、BeginRead() によって予約された OS の貴重なリソースをリークしたくありません。

また、ストリームの状態のテストと条件付きの EndRead() の間でストリームを閉じることができることも知っていますが、ストリームが閉じていることがわかっているときに EndRead() を省略できる場合、大部分のケースで例外処理を節約できます。 .

私はそれを間違っていますか?

ありがとう!

4

1 に答える 1

7

GCHandle■ バッファを確保し、その他の管理されていないリソースは完了ポート コールバックによって解放されます。管理されていない構造は、ファイナライズOVERLAPPEDされるまでぶらぶらします。IAsyncResultこれは、アプリケーションのネットワーク負荷が大きくない場合は許容できるかもしれませんが、アプリケーションが毎秒多くの接続を処理する場合は問題になる可能性があります。ファイナライズは完全な GC コレクションの後で別のスレッドでのみ行われるためです。

注意: これらは Reflector で取得した実装の詳細です。買い手責任負担。

于 2011-06-23T08:22:02.653 に答える