我正在努力学习async/await
,所以这听起来像是一个愚蠢的问题,但我目前正在开发一个基本的 TCP 服务器,并尝试使用async/await
而不是手动线程来处理多个连接。
在一个NetworkClient
类中,我有以下方法:
public async Task Start()
{
using (var reader = new StreamReader(_socket.GetStream()))
{
while (_server.IsRunning)
{
try
{
var content = await reader.ReadLineAsync().ConfigureAwait(false);
if (content == null)
{
Console.WriteLine("Client {0} disconnected", _id);
return;
}
Console.WriteLine("Client {0} wrote: {1}", _id, content);
}
catch (IOException)
{
Console.WriteLine("Client {0} disconnected", _id);
return;
}
}
}
}
我的侦听客户端连接的循环包含以下代码:
private void ListenForClients()
{
var numClients = 0;
while (IsRunning)
{
var tcpClient = _listener.AcceptTcpClient();
var netClient = new NetworkClient(this, tcpClient, numClients);
netClient.Start();
Console.WriteLine("Client {0} Connected", numClients);
numClients++;
}
}
这可以按我的预期工作,允许多个 telnet 连接同时连接并向服务器发送消息。但是,resharper 告诉我应该添加await
,netClient.Start();
否则它不会阻塞。但是,我不想让它阻塞!
Resharper 给我这样的警告的事实让我怀疑我是否async/await
错误地接近系统。为什么 Resharper 要我添加await
到这行代码中,以及使用此代码的正确方法是什么,这样不会netClient.Start();
阻止其他 tcp 连接加入?