如何正确读取TCP流而不阻塞

时间:2015-08-10 14:18:41

标签: c# sockets tcp

我有一个TCP服务器(异步)和TCP客户端(同步)。

TCP服务器正在向客户端发送数据,如下所示:

private async Task Send(TcpClient client, CancellationToken ct, string message) {
            Console.WriteLine("Sending Message " + message);
            message += "<EOF>";
            NetworkStream stream = client.GetStream();
            byte[] msg = Encoding.ASCII.GetBytes(message);
            await stream.WriteAsync(msg, 0, msg.Length, ct).ConfigureAwait(false);
        }

我的客户端每次更新都会调用此内容

private string ReadStream(){
   if(stream.DataAvailable) 
        return reader.ReadLine();
}

这导致我的客户端阻止。在我的代码中,我确实有一些字符串构建技术来累积读取流,因此我可以搜索"<EOF>"以了解此消息何时完成。但似乎如果我不断开客户端与服务器的连接,客户​​端将永远挂起。

从客户端的角度来看,持续读取TCP套接字的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

潜在阻塞代码的最佳解决方案之一是使用线程,以便它不会阻止任何内容或任何其他代码的UI。它在自己的小世界中运行。

Task mytask = Task.Factory.StartNew(myfunc,aparam);

你甚至可以这样做(沿着行,而不是放在编码窗口来检查语法)

var mytask = Task.Factory.StartNew(myfunc).ContinueWith( result => its_done_func());

因此,您可以告诉它何时完成,您还可以使用函数来更新所有结果。你当然也可以使用lambda。

相关问题