我遇到问题,我的代码在我单步执行时按预期工作,但在正常运行时会读取错误的数据。我认为问题可能是时间问题,但是NetworkStream.Read()
应该阻塞,我也通过让线程在 1000ms 中休眠来测试这个问题(超过我给予的时间和时间更多)单步执行。
代码的目的(以及单步执行时的操作)是将位图图像读入缓冲区,缓冲区前面是一个字符串,其中包含以字节为单位的图像大小,后跟回车符和新行。我认为问题在于阅读陈述,但我无法确定。以下代码包含在一个包含Telnet读取的较大循环中,但是我没有问题,它们只读取ASCII字符串,没有二进制数据。
List<byte> len = new List<byte>();
byte[] b = new byte[2];
while (!Encoding.ASCII.GetString(b).Equals("\r\n"))
{
len.Add(b[0]);
b[0] = b[1];
b[1] = (byte)stream.ReadByte();
}
len = len.FindAll(x => x != 0);
len.Add((byte)0);
string lenStr = Encoding.ASCII.GetString(len.ToArray());
int imageSize = int.Parse(lenStr);
byte[] imageIn = new byte[imageSize];
stream.Read(imageIn, 0, imageSize);
using (MemoryStream g = new MemoryStream(imageIn))
{
g.Position = 0;
bmp = (Bitmap)Image.FromStream(g);
}
代码发生的实际问题是,第一次正确运行时会收到长度和图像,但它似乎不能识别连续读取中的\r\n
,但这可能只是一个症状而不是问题本身。
提前致谢!
编辑:
所以我确实缩小了问题,并设法通过在我的Telnet调用之间添加一些人工延迟来使用NetworkStream.Write()
来检索图像和networkStream.Read()
来检索它,但是这个解决方案很麻烦我我还是想知道为什么会出现这个问题
答案 0 :(得分:1)
count
操作返回实际读取的字节数。它仅在有 no 数据时才会阻塞,并且它可以返回byte[] imageIn = new byte[imageSize];
int remaining = imageSize;
int offset = 0;
while (remaining > 0)
{
int read = stream.Read(imageIn, offset, remaining);
if (read == 0) throw new Exception("Connection closed before expected data was read");
offset += read;
remaining -= read;
}
参数指定的较少字节数。
您可以通过将其置于循环内来轻松解决此问题:
SELECT *
FROM StudentGrades
WHERE ', ' + SchoolGrades + ', ' LIKE '%, ' + CurrentGrade + ', %'