避免NetworkStream读取块

本文关键字:读取 NetworkStream 避免 | 更新日期: 2023-09-27 18:28:46

目前我正在开发一个程序,该程序使用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();
    }
}

避免NetworkStream读取块

我会尽我所能给你一些提示。如果您不希望UI被冻结,您应该将此代码放在单独的线程上,或者将其作为异步任务运行,正如Wouter所评论的那样。在我看来,如果你既不知道你预计会收到多少字节,也不知道它们什么时候会来,这将是更好的方法。正如您所说,如果您想让这个任务长时间运行,线程将是一个很好的解决方案。

然而,如果可能的话,您应该关注两件事:TcpClient ReadTimeout属性和通过stream.Read()的第三个参数的预期长度。这意味着你将被阻止X毫秒,直到你收到你想要的数量。我在事务服务器上做了很多工作,在这些网络之间传输的数据包以包的长度为前缀。如果是这种情况,我建议您先读取前缀,然后计算要读取的字节数,然后执行最后一次读取操作。

希望这能有所帮助,这是我的第一个答案。