![](/img/trans.png)
[英]NetworkStream.ReadTimeout failing to block on NetworkStream.Read(…) when daylight savings are applied and clock moves backwards
[英]Avoid NetworkStream read block
目前,我一直在研究使用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毫秒,直到收到所需的数量为止。 我在事务处理服务器上做了很多工作,其中在那些网络之间传输的数据包以包的长度为前缀。 如果是这种情况,我建议先读取前缀,然后计算剩余要读取的字节数,然后执行最后一个读取操作。
希望这会有所帮助,这是我的第一个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.