C# 当我希望我的异步方法不阻塞时,为什么Resharper坚持我添加wait?
我正在尝试学习C# 当我希望我的异步方法不阻塞时,为什么Resharper坚持我添加wait?,c#,async-await,C#,Async Await,我正在尝试学习async/await,所以这听起来像是个愚蠢的问题,但我目前正在使用一个基本的TCP服务器,并尝试使用async/await而不是手动线程来处理多个连接 在NetworkClient类中,我有以下方法: public async Task Start() { using (var reader = new StreamReader(_socket.GetStream())) { while (_server.
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;
}
}
}
}
侦听客户端连接的My循环包含以下代码:
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告诉我应该将wait
添加到netClient.Start()代码>否则它不会阻塞。但是,我不想让它阻挡
Resharper给了我这样的警告,这让我怀疑我是否在错误地接近async/await
系统。为什么Resharper要我在这行代码中添加wait
,正确的方法是什么
不会阻止其他tcp连接加入?您的Start
方法不是真正的异步方法-它看起来像是在等待连接同步发生,然后异步读取数据。因此,listenforcients
中的代码确实按照您期望的方式工作,Start
的同步部分在控制台之前完成。WriteLine
(因此它打印正确的文本),异步部分将自动运行,而无需等待结果
此代码本质上与“连接+触发并忘记处理读取数据的新线程”相同
async
/等待
当您需要使用异步操作编写顺序代码时,它会发光。在您的情况下,您确实需要并行操作-其他一些构造可能会更好地启动多个侦听器。使用await
,每个侦听器的代码可能会受益—在循环中使用await read/await write比使用带有事件的多个状态(甚至更糟的是EndSend/SendReceive…)简单得多.您的Start
方法不是真正的异步方法-它看起来像是在等待连接同步发生,然后异步读取数据。因此,listenforcients
中的代码确实按照您期望的方式工作,Start
的同步部分在控制台之前完成。WriteLine
(因此它打印正确的文本),异步部分将自动运行,而无需等待结果
此代码本质上与“连接+触发并忘记处理读取数据的新线程”相同
async
/等待
当您需要使用异步操作编写顺序代码时,它会发光。在您的情况下,您确实需要并行操作-其他一些构造可能会更好地启动多个侦听器。使用await
,每个侦听器的代码可能会受益—在循环中使用await read/await write比使用带有事件的多个状态(甚至更糟的是EndSend/SendReceive…)简单得多
然而,resharper告诉我应该将wait添加到netClient.Start()中;因为否则它不会阻塞。但是,我不想让它阻挡
ReSharper将对此情况发出警告,因为这通常是一个错误
在您的情况下,您可以在您的类型中创建一个表示Start
方法的private Task
成员,并将其分配给它,而不是wait
它:
startTask = netClient.Start();
这将避免警告,并使您能够确定Start
方法何时退出并检测它引发的任何异常
然而,resharper告诉我应该将wait添加到netClient.Start()中;因为否则它不会阻塞。但是,我不想让它阻挡
ReSharper将对此情况发出警告,因为这通常是一个错误
在您的情况下,您可以在您的类型中创建一个表示Start
方法的private Task
成员,并将其分配给它,而不是wait
它:
startTask = netClient.Start();
这应该可以避免警告,并使您能够确定
Start
方法何时退出,并检测它抛出的任何异常。它以前不是被问过很多次吗?例如,in或in等async
在没有等待的情况下(以及之前,有时甚至之后)wait
不会执行任何操作。它只是告诉编译器,await
可能用于一种方法,但我不使用不带await的异步方法。我的Start()
方法中显然有一个wait
调用。问题是非异步方法调用的是异步方法,band Resharper确信我应该使用Wait for it,尽管这不是我想要的行为。对不起,我记得以前在所有可能的变体中,它被多次废弃,但在没有重新读取的情况下放进了引用。该问题讨论了类似的情况,当Resharper对体内含有await
的async
方法发出警告时,它不是被问了很多次吗?例如,in或in等async
在没有等待的情况下(以及之前,有时甚至之后)wait
不会执行任何操作。它只是告诉编译器,await
可能用于一种方法,但我不使用不带await的异步方法。我的Start()
方法中显然有一个wait
调用。问题是非异步方法调用的是异步方法,band Resharper确信我应该使用Wait for it,尽管这不是我想要的行为。对不起,我记得以前在所有可能的变体中,它被多次废弃,但在没有重新读取的情况下放进了引用。这个问题讨论了类似的情况,当Resharper在其主体中包含await
的async
方法上发出警告时,我不确定我是否理解。我的明星