0

ストリームを監視するパーサーに取り組んでいます(おそらくからNetworkStream)。ソース ストリームに特定のデータが表示されると、新しいストリームMemoryStreamが作成され、ソースからの関連データが書き込まれます。

次に、 for parse を として解析する別のクラス メソッドに渡しMemoryStreamます。このメソッドでは aが作成されます。実際にはデータの最後にあるため、データを読み取ろうとすると何もありません。MemoryStreamStreamBinaryReaderBinaryReader

BinaryReader にはPositionプロパティやSeekメソッドがないため、下線のBaseStream位置を変更する必要があります。位置が変更されると、ストリームを解析できます。

この場合、データを追加していないので問題ありません。しかし、同様の状況が発生し、追加のデータが書き込まれる場合、位置の値が背後で変更されたため、これが機能しない可能性があると思います。

ここでの意味については少しあいまいです。

書き込み側と読み取り側は、 のコピーBaseStreamとその位置、または元のオブジェクトの破損を許容していますか?

これは、ライターを作成すると同時にリーダーを作成する必要があることを意味しますBaseStreamか? これはより良い習慣かもしれないと思います。

BinaryReader と Writer は独自の位置情報を保持していますか? プロパティがそこにないからではありません。そうでない場合、同じスレッドで同時に使用できますか?

更新#1:その後撤回された回答とコメントに基づいて、混乱を少し明確にする必要があると思います。と の両方にBaseStreamプロパティがあります。ライターとリーダーの作成に使用されたストリーム オブジェクトを指していると思いました。両方に固有の単なるワーカーオブジェクトだと思い始めています。BinaryWriterBinaryReader

ソースとして複数のタイプのストリームにオープンなままでいるため、ストリーム オブジェクトについてはあまり想定したくありません。

更新 #2:いくつかのテスト コードを実行すると、それらが接続されていることがわかります。データが書き込まれると、リーダーの位置に影響します。ストリームの次の部分を読んで、中断したところから再開できるように、リーダーが影響を受けないままにしておくと便利だと思いました。私は次のようなものを想像しました:

  • データ イベントが発生します。このイベントにより、ライターによってデータが書き込まれます。
  • ある時点で、リーダーはストリーム内のデータの一部を処理します。
  • 別のイベントが発生して、さらにデータが書き込まれます。
  • リーダーが既に作業しているデータに追加されます。
  • リーダーは、新しいデータを含めて作業を終了します。

しかし、リーダーとライターの間で位置が機能する方法に基づいて、これはストリームが使用される方法ではありません。

おそらく私の概念の問題は、私の BaseStream が MemoryStream であり、ルールが NetworkStream の場合とは異なるためです。ストリームのソースの実装の詳細を読み取りクラスから除外しようとしていました。

この時点で、私は質問に対する答えを持っていると思います。ここで、ストリームを使用して頭の中にあるようなことを行うための情報を見つける必要があります。

4

1 に答える 1

0

MemoryStream を使用すると、Reader と Writer がベース ストリーム内の位置を更新することがわかりました。したがって、位置値のコピーと復元をジャグリングせずに、まだ書き込まれているストリームを読み取ることはできません。推奨されません。

トランザクション全体を MemoryStream に書き込んで別のクラスに渡すことができるように、作業をやり直しました。次のトランザクションのために新しい MemoryStream を作成します。

ベース ストリームは指定されたストリームの派生物ではなく、実際のストリームです。

于 2013-07-05T00:10:02.547 に答える