目前我一直在开发一个使用TcpClient从服务器接收数据的程序。我的问题是,每当我读取流直到我的客户端停止工作时,它就会冻结。我想保持与服务器的连续连接,但是在我的 while 函数运行两次之后,第三个循环不执行读取,并且从不返回任何内容。
我怎样才能打破或返回这个 while 循环,或者以某种方式绕过阅读块?
using (NetworkStream stream = client.GetStream())
{
byte[] data = new byte[2048];
using (MemoryStream ms = new MemoryStream())
{
int numBytesRead;
while ((numBytesRead = stream.Read(data, 0, data.Length)) > 0)
{
ms.Write(data, 0, numBytesRead);
}
return ms.ToArray();
}
}
我解决了这个问题,并在另一个问题中说明了这一点。 看看这里。
我会尽力给你一些提示。如果您不希望 UI 被冻结,您应该将此代码放在“单独的线程”上,或者将其作为“异步任务”运行,正如 Wouter 评论的那样。在我看来,如果您既不知道预期接收多少字节,也不知道它们何时到达您手中,那么这将是更好的方法。正如你所说,如果你想让这个任务长时间运行,线程将是一个很好的解决方案。
尽管如此,如果可能的话,您应该关注两件事:您的 TcpClient ReadTimeout
属性以及您通过
stream.Read()
的第三个参数传递的预期长度。这意味着您将被阻止 X 毫秒,直到您收到所需的数量。我在事务服务器上做了很多工作,其中在这些网络之间传输的数据包以包的长度为前缀。如果是这种情况,我建议先读取前缀,然后计算剩余要读取的字节数,然后执行最后一次读取操作。
希望这有帮助,这是我的第一个答案。