1

TCP 接続を開いて、NetworkStream.BeginRead() を使用して読み取ります。いずれかの端で接続が閉じられると、コールバックが呼び出され、ストリーム オブジェクトは役に立たなくなります。ドキュメントにあるように、EndRead() は、この場合、接続を終了した端に応じて IOException または ObjectDisposedException をスローします。

最後に成功した EndRead (および再 BegingRead) と切断の間、特に最後にそれを行った場合、欠落しているデータがないことが保証されていますか? そうでない場合、接続を閉じている場合は、未読のものがないように切断するときに NetworkStream.Read() を手動で行う必要がありますか?

4

1 に答える 1

2

この場合に使用するパターンは、BeginRead を使用してストリームを読み取り (まさにあなたが行っているように)、コールバック メソッドで「ストリーム内のデータが増える」ケースを処理することです。
コールバック メソッドは EndRead を呼び出し、ストリームから読み取ったデータを収集し (通常は StringBuilder インスタンスに追加することによって) 、次に BeginRead を再度呼び出します。EndRead が 0 バイトを返すとすぐに、ストリームから読み取るデータがなくなることが保証されます。

役に立つと思われるドキュメントは次のとおりです: Using async client sockets

0 バイトの戻り値が保証であると明確に述べられていないことに気付いたので、ここでの混乱は理解できますが、この例は、それが読書をやめる合図であることを非常に明確に示しています。

于 2010-06-24T15:22:03.950 に答える