1

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

在下面的代码中:

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

当我注释掉第一行时,数据最终不会像我有那个打印行语句时那样变脏(或者,不会像通常那样变脏)。据我所知,来自服务器端的数据是干净的,所以我的套接字实现可能存在一些问题。但是有谁知道为什么添加该打印行会导致数据更频繁地变脏?

4

3 回答 3

1

您的二进制阅读器看起来像是一个私有成员变量(如果前导下划线是一个告诉标志)。

您的应用程序是多线程的吗?如果另一个线程在您读取它时也尝试使用您的 binaryReader,您可能会遇到竞争情况。即使没有这条线,您也会遇到问题,这对我来说似乎很可疑。

于 2012-02-10T17:59:53.883 回答
0

你确定你的阅读逻辑是正确的吗?Stream.Length指示整个流的长度,而不是要读取的剩余数据的长度。

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

于 2012-02-10T20:17:36.877 回答
0

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

于 2012-02-10T22:56:31.080 回答