最终我采取的做法是,在每次从流中读取块后,在我的循环的最后一步中执行简单的Thread.Sleep(1)。这似乎给系统留出了时间更新,我得到了准确的结果,但这似乎有点不正当,并且对于解决方案来说有相当多的“特殊情况”。
下面是我正在处理的情况列表:单个TCP连接,连接了一个IIS应用程序和一个单独的应用程序,两者均以C#编写,用于发送/接收通信。它发送请求然后等待响应。这个请求是由HTTP请求发起的,但我在从HTTP请求中读取数据后没有遇到这个问题,而是在之后。
以下是处理传入连接的基本代码。
protected void OnClientCommunication(TcpClient oClient)
{
NetworkStream stream = oClient.GetStream();
MemoryStream msIn = new MemoryStream();
byte[] aMessage = new byte[4096];
int iBytesRead = 0;
while ( stream.DataAvailable )
{
int iRead = stream.Read(aMessage, 0, aMessage.Length);
iBytesRead += iRead;
msIn.Write(aMessage, 0, iRead);
Thread.Sleep(1);
}
MemoryStream msOut = new MemoryStream();
// .. Do some processing adding data to the msOut stream
msOut.WriteTo(stream);
stream.Flush();
oClient.Close();
}
欢迎提供任何反馈,以获得更好的解决方案,或者简单点赞确认需要在检查DataAvailable值之前进行Sleep(1)操作,以确保正确更新。
我想猜测,经过两年后,希望这个问题的答案不是仍然如此 :)