首次迭代循环

时间:2017-07-31 13:00:47

标签: c# visual-studio

我遇到问题,我的代码在我单步执行时按预期工作,但在正常运行时会读取错误的数据。我认为问题可能是时间问题,但是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()来检索它,但是这个解决方案很麻烦我我还是想知道为什么会出现这个问题

1 个答案:

答案 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 + ', %'