C# 二进制读取器的奇怪行为

C# 二进制读取器的奇怪行为,c#,silverlight,sockets,stream,binaryreader,C#,Silverlight,Sockets,Stream,Binaryreader,我有一个基于套接字的应用程序,它在客户端使用BinaryReader对象公开接收到的数据。我一直在试图调试一个问题,其中包含在读卡器中的数据不干净。。。i、 e.我正在读取的缓冲区包含超过新数据大小的旧数据 在下面的代码中: System.Diagnostics.Debug.WriteLine("Stream length: {0}", _binaryReader.BaseStream.Length); byte[] buffer = _binaryReader.ReadBytes((int)_

我有一个基于套接字的应用程序,它在客户端使用
BinaryReader
对象公开接收到的数据。我一直在试图调试一个问题,其中包含在读卡器中的数据不干净。。。i、 e.我正在读取的缓冲区包含超过新数据大小的旧数据

在下面的代码中:

System.Diagnostics.Debug.WriteLine("Stream length: {0}", _binaryReader.BaseStream.Length);
byte[] buffer = _binaryReader.ReadBytes((int)_binaryReader.BaseStream.Length);

当我注释掉第一行时,数据不会像我使用print-line语句时那样变脏(或者,不会经常变脏)。据我所知,数据从服务器端干净地传入,因此我的套接字实现可能存在一些问题。但是有人知道为什么添加打印行会导致数据更频繁地变脏吗?

您的二进制读取器看起来像是一个私有成员变量(如果前导下划线是指示符号)


您的应用程序是多线程的吗?如果另一个线程试图在您读取二进制读取器时也使用它,那么您可能会遇到争用情况。事实上,即使没有这条线,你也会遇到问题,这一点在我看来相当可疑

二进制读取器看起来像是一个私有成员变量(如果前导下划线是指示符号)


您的应用程序是多线程的吗?如果另一个线程试图在您读取二进制读取器时也使用它,那么您可能会遇到争用情况。事实上,即使没有这条线,你也会遇到问题,这一点在我看来相当可疑

您确定您的阅读逻辑正确吗<代码>流。长度表示整个流的长度,而不是要读取的剩余数据的长度


假设最初有100个字节可用
Length
为100,并且
BinaryReader
更正读取的100字节,并将流位置提前100。然后,又有20个字节到达<代码>长度现在是120;但是,您的
BinaryReader
应该只读取20个字节,而不是120个字节。在第二次读取中请求的“额外”100字节将导致其阻塞或(如果流未正确实现)中断。

您确定读取逻辑正确吗<代码>流。长度表示整个流的长度,而不是要读取的剩余数据的长度


假设最初有100个字节可用
Length
为100,并且
BinaryReader
更正读取的100字节,并将流位置提前100。然后,又有20个字节到达<代码>长度现在是120;但是,您的
BinaryReader
应该只读取20个字节,而不是120个字节。在第二次读取中请求的“额外”100字节将导致其阻塞或(如果流未正确实现)中断。

该问题愚蠢且无关。然而,我相信我上面的阅读逻辑是正确的。问题是我使用的_binaryReader是一个不属于我的类的引用,因此底层流被用坏数据重写。

这个问题很愚蠢,也不相关。然而,我相信我上面的阅读逻辑是正确的。问题是,我使用的_binaryReader是一个不属于我的类的引用,因此底层流正在被坏数据重写。

是的长度应该是long类型。。您在哪里声明它…?例如,如果我想读取字节,我会执行类似以下FileStream fs=File.OpenRead(inputfilepath)的操作;字节[]缓冲区=新字节[fs.Length];fs.Read(buffer,0,buffer.Length);作为一个例子,我不知道这是怎么应用的。。。据我所知,ReadBytes分配并返回缓冲区。我仍然不确定我是否理解。我使用的socket API提供了一个二进制读取器,所以我不想改变它。我如何读取使用它接收的字节?MSDN文档表明我所做的是正确的,但不是很清楚。是的长度应该是long类型。。您在哪里声明它…?例如,如果我想读取字节,我会执行类似以下FileStream fs=File.OpenRead(inputfilepath)的操作;字节[]缓冲区=新字节[fs.Length];fs.Read(buffer,0,buffer.Length);作为一个例子,我不知道这是怎么应用的。。。据我所知,ReadBytes分配并返回缓冲区。我仍然不确定我是否理解。我使用的socket API提供了一个二进制读取器,所以我不想改变它。我如何读取使用它接收的字节?MSDN文档表明,我所做的是正确的,但不是很清楚。它是一个成员,但我用
AutoResetEvent
s保护它。它是一个成员,但我用
AutoResetEvent
s保护它。似乎与前面提到的“如果另一个线程试图在您向它写入时也使用它”的场景非常接近在上面无论如何,幸好你找到了!同意。标记为答案。似乎非常接近上面提到的“如果另一个线程在您向其写入时也尝试使用它”场景。无论如何,幸好你找到了!同意。标记为答案。