2

次の例外が発生します。

System.NotSupportedException : This stream does not support seek operations.
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.WriteByte(Byte value)

次のリンクは、これがマイクロソフトの既知の問題であることを示しています。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=273186

このスタックトレースは、次の 2 つのことを示しています。

  1. System.IO.BufferedStream は、ばかげたポインタ移動操作を行います。BufferedStream は、基礎となるストリームをバッファする必要があります。このようなシーク操作があるとバッファの品質が悪くなります。
  2. Seek をサポートしていないストリームでは安定して動作しません。

代替手段はありますか?C# で NetworkStream と一緒にバッファーが必要ですか、それとも既にバッファーされていますか。

編集: 基になるソケット ストリームへの読み取り/書き込み呼び出しの数を単純に減らしたい。

4

3 に答える 3

2

NetworkStream は既にバッファリングされています。受信したすべてのデータはバッファに保持され、読み取りを待機します。read の呼び出しは非常に高速になるか、ネットワーク上の他のピアからデータが受信されるのをブロックして待機します。いずれの場合も BufferedStream は役に立ちません。

ブロッキングが心配な場合は、基礎となるソケットを非ブロッキング モードに切り替えることを検討できます。

于 2009-02-15T20:44:45.127 に答える
1

BufferedStream単純に、基になるストリーム (IO/ハードウェアにバインドされている可能性があります) への読み取り/書き込み呼び出しの数を減らすように機能します。シーク機能を提供することはできません (実際、バッファリングとシークは多くの点で相反します)。

なぜ探す必要があるの?おそらく、最初にストリームをシーク可能なもの (aMemoryStreamまたは a ) にコピーしFileStreamてから、その 2 番目のシーク可能なストリームから実際の作業を行います。

具体的な目的はありますか?詳細については、より適切なオプションを提案できるかもしれません...

特に、好奇心に注意してくださいNetworkStream-ほとんどのストリームでは、読み取り/書き込みは同じ物理ストリームに関連しています。ただし、NetworkStream実際には、a は 2 つの完全に独立したパイプを表します。読み取りと書き込みはまったく無関係です。同様に、すでに圧縮されたバイトをシークすることはできません...データをスキップできますが、いくつかの操作を実行しReadてデータを破棄することでより適切に実行できます。

于 2009-02-15T20:02:39.690 に答える
1

解決策BufferedStreamは、受信用と送信用の2 つの独立した を使用することです。BufferedStreamそして、送信を適切にフラッシュすることを忘れないでください。


2018 年になっても、この質問に対する満足のいく答えを得るのは難しいように思われるため、人類のために、ここに私の 2 セントを示します。

はOS 側でバッファリングされますNetworkStream ただし、.net 側でバッファリングする理由がないわけではありません。TCP は Write-Read (繰り返し) では適切に動作しますが、遅延 ack などにより Write-Write-Read でストールします。

私のように、21 世紀に向けて標準以下のプロトコル コードを大量に持っている場合は、バッファリングする必要があります。

または、上記に固執する場合は、読み取り/rcvsのみ、または書き込み/送信のみをバッファリングし、コードがどの程度壊れているかに応じて、反対側に直接使用することもできますNetworkStream一貫性を保つ必要があります。

BufferedStreamドキュメントで十分に明確にされていないのは、ストリームが seekable である場合にのみ読み取りと書き込みを切り替える必要があるということです。これは、読み取りと書き込みを同じバッファーにバッファーするためです。BufferedStreamでは単にうまく機能しませんNetworkStream

Marc が指摘したように、この問題の原因は、.net の最大の設計上の決定の 1 つではない、2 つのストリームを 1 つの NetworkStream に統合することです。

于 2018-10-04T10:20:59.660 に答える