我有一个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套接字的更好方法是什么?
答案 0 :(得分:1)
潜在阻塞代码的最佳解决方案之一是使用线程,以便它不会阻止任何内容或任何其他代码的UI。它在自己的小世界中运行。
Task mytask = Task.Factory.StartNew(myfunc,aparam);
你甚至可以这样做(沿着行,而不是放在编码窗口来检查语法)
var mytask = Task.Factory.StartNew(myfunc).ContinueWith( result => its_done_func());
因此,您可以告诉它何时完成,您还可以使用函数来更新所有结果。你当然也可以使用lambda。