繁体   English   中英

避免NetworkStream读取块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM