目前我一直致力于使用TcpClient从服务器接收数据的程序。我的问题是,每当我读到流,直到我的客户端停止工作,它就会冻结。我希望保持与服务器的连续连接,但是在我的while函数运行两次后,第三个循环不执行读取,并且永远不会返回任何内容。
As this answer states that I'm correct
如何在循环中断开或返回此循环,或以某种方式绕过读取块?
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();
}
}
答案 0 :(得分:-1)
我会尽力给你一些提示。如果您不希望冻结用户界面,则应将此代码放在单独的线程上,或将其作为异步任务运行,如Wouter所评论的那样。在我看来,如果你既不知道你期望收到多少字节,也不知道它们何时会来找你,那么这将是更好的方法。正如你所说,如果你想让这个任务长时间运行一个线程将是一个很好的解决方案。
尽管如此,如果可能,您应该关注两件事:您的TcpClient ReadTimeout
属性以及您通过stream.Read()
的第三个参数的预期长度。这意味着您将被阻止X毫秒,直到您收到所需的数量。我在事务服务器上工作了很多,其中在这些网络之间传输的数据包以包的长度为前缀。如果是这种情况,我建议先读取前缀,然后计算剩余的读取字节数,然后再执行上一次读操作。
希望这有帮助,这是我的第一个答案。