避免 NetworkStream 读取阻塞

问题描述 投票:0回答:2

目前我一直在开发一个使用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();
    }
}
c# tcpclient
2个回答
0
投票

我解决了这个问题,并在另一个问题中说明了这一点。 看看这里


-1
投票

我会尽力给你一些提示。如果您不希望 UI 被冻结,您应该将此代码放在“单独的线程”上,或者将其作为“异步任务”运行,正如 Wouter 评论的那样。在我看来,如果您既不知道预期接收多少字节,也不知道它们何时到达您手中,那么这将是更好的方法。正如你所说,如果你想让这个任务长时间运行,线程将是一个很好的解决方案。 尽管如此,如果可能的话,您应该关注两件事:您的 TcpClient ReadTimeout 属性以及您通过

stream.Read()

的第三个参数传递的预期长度。这意味着您将被阻止 X 毫秒,直到您收到所需的数量。我在事务服务器上做了很多工作,其中在这些网络之间传输的数据包以包的长度为前缀。如果是这种情况,我建议先读取前缀,然后计算剩余要读取的字节数,然后执行最后一次读取操作。


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

© www.soinside.com 2019 - 2024. All rights reserved.