C# 更改BinaryReader的基流位置如何影响使用相同基流的BinaryWriter的当前状态?

C# 更改BinaryReader的基流位置如何影响使用相同基流的BinaryWriter的当前状态?,c#,stream,binaryreader,binarywriter,C#,Stream,Binaryreader,Binarywriter,我正在开发一个监视流的解析器(可能来自网络流)。当在源流上看到某些数据时,将创建一个新的MemoryStream,并将源中的相关数据写入其中 然后我将用于解析的MemoryStream传递给另一个类方法,该类方法将MemoryStream解析为流。在此方法中,将创建一个BinaryReader。当它开始读取数据时,没有数据,因为BinaryReader实际上位于数据的末尾 BinaryReader没有Position属性或Seek方法,因此需要更改下划线BaseStream位置。一旦改变位置,就

我正在开发一个监视流的解析器(可能来自
网络流
)。当在源流上看到某些数据时,将创建一个新的
MemoryStream
,并将源中的相关数据写入其中

然后我将用于解析的
MemoryStream
传递给另一个类方法,该类方法将
MemoryStream
解析为
流。在此方法中,将创建一个
BinaryReader
。当它开始读取数据时,没有数据,因为
BinaryReader
实际上位于数据的末尾

BinaryReader没有
Position
属性或
Seek
方法,因此需要更改下划线
BaseStream
位置。一旦改变位置,就可以解析流

在这种情况下,我们没有添加额外的数据,因此没有问题。但我想到,如果出现类似的情况,并且要将额外的数据写入,这可能不起作用,因为位置值在其背后发生了更改

我对这里的含义有点模糊

编写器和读取器是否处理
基流的副本及其位置或允许损坏的原始对象

这是否意味着我需要在创建writer的同时创建reader,以便两者都从同一点开始,然后将reader传递给方法,而不是
基流
?我认为这可能是一个更好的做法

BinaryReader和Writer是否维护自己的位置信息?我不是因为财产不在那里才这么做的。如果没有,您可以在同一线程中同时使用它们吗

更新#1:根据一份被撤回的答复和评论,我想我需要澄清一下我的困惑。
BinaryWriter
BinaryReader
中都有一个
BaseStream
属性。我认为它指向用于创建writer和reader的stream对象。我开始认为它只是一个工作者对象,对两者都是独一无二的

我不想对流对象做太多假设,这样我就可以作为一个源对多种类型的流保持开放

更新#2:现在运行一些测试代码后,我看到它们已连接。写入数据时会影响读卡器的位置。我本以为读者不受影响是有用的,这样它就可以从中断的地方开始,阅读流的下一部分。 我设想了这样的事情:

  • 发生数据事件。该事件导致写入程序写入数据
  • 在某个时刻,读取器处理流中的一些数据
  • 发生另一个事件,导致写入更多数据
  • 它被附加到读卡器已经在处理的数据中
  • 读者完成包括新数据在内的工作
但基于读者和作者之间的位置工作方式,这不是流的使用方式

也许我的概念问题是因为我的BaseStream是一个MemoryStream,规则与NetworkStream不同。我试图将流的源代码的实现细节排除在阅读类之外


我想现在我已经找到了问题的答案。现在,我需要找到关于使用流来完成我脑海中的事情的信息。

我发现使用MemoryStream时,读写器会更新基本流中的位置。因此,如果不复制和恢复位置值,就无法读取仍在写入的流。不推荐

我修改了一些东西,以便可以将整个事务写入MemoryStream,并将其传递给另一个类。为下一个事务创建一个新的MemoryStream

基本流不是给定流的派生,而是实际流