私は学習しようとして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 接続が同時にサーバーに接続してメッセージを送信できるようにします。await
ただし、 resharper は、追加する必要があることを教えてくれnetClient.Start();
ます。そうしないとブロックされないからです。でも、ブロックしたくない!
Resharper がこのような警告を発しているという事実は、async/await
システムへのアプローチが間違っているのではないかと考えさせられます。Resharper がこのコード行に追加する必要があるのはなぜですか? また、他の tcp 接続の参加をブロックしないようawait
に、これを使用する正しい方法は何ですか?netClient.Start();