ストリームを監視するパーサーに取り組んでいます(おそらくからNetworkStream
)。ソース ストリームに特定のデータが表示されると、新しいストリームMemoryStream
が作成され、ソースからの関連データが書き込まれます。
次に、 for parse を として解析する別のクラス メソッドに渡しMemoryStream
ます。このメソッドでは aが作成されます。実際にはデータの最後にあるため、データを読み取ろうとすると何もありません。MemoryStream
Stream
BinaryReader
BinaryReader
BinaryReader にはPosition
プロパティやSeek
メソッドがないため、下線のBaseStream
位置を変更する必要があります。位置が変更されると、ストリームを解析できます。
この場合、データを追加していないので問題ありません。しかし、同様の状況が発生し、追加のデータが書き込まれる場合、位置の値が背後で変更されたため、これが機能しない可能性があると思います。
ここでの意味については少しあいまいです。
書き込み側と読み取り側は、 のコピーBaseStream
とその位置、または元のオブジェクトの破損を許容していますか?
これは、ライターを作成すると同時にリーダーを作成する必要があることを意味しますBaseStream
か? これはより良い習慣かもしれないと思います。
BinaryReader と Writer は独自の位置情報を保持していますか? プロパティがそこにないからではありません。そうでない場合、同じスレッドで同時に使用できますか?
更新#1:その後撤回された回答とコメントに基づいて、混乱を少し明確にする必要があると思います。と の両方にBaseStream
プロパティがあります。ライターとリーダーの作成に使用されたストリーム オブジェクトを指していると思いました。両方に固有の単なるワーカーオブジェクトだと思い始めています。BinaryWriter
BinaryReader
ソースとして複数のタイプのストリームにオープンなままでいるため、ストリーム オブジェクトについてはあまり想定したくありません。
更新 #2:いくつかのテスト コードを実行すると、それらが接続されていることがわかります。データが書き込まれると、リーダーの位置に影響します。ストリームの次の部分を読んで、中断したところから再開できるように、リーダーが影響を受けないままにしておくと便利だと思いました。私は次のようなものを想像しました:
- データ イベントが発生します。このイベントにより、ライターによってデータが書き込まれます。
- ある時点で、リーダーはストリーム内のデータの一部を処理します。
- 別のイベントが発生して、さらにデータが書き込まれます。
- リーダーが既に作業しているデータに追加されます。
- リーダーは、新しいデータを含めて作業を終了します。
しかし、リーダーとライターの間で位置が機能する方法に基づいて、これはストリームが使用される方法ではありません。
おそらく私の概念の問題は、私の BaseStream が MemoryStream であり、ルールが NetworkStream の場合とは異なるためです。ストリームのソースの実装の詳細を読み取りクラスから除外しようとしていました。
この時点で、私は質問に対する答えを持っていると思います。ここで、ストリームを使用して頭の中にあるようなことを行うための情報を見つける必要があります。