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
方法上发出警告时,我不确定我是否理解。我的
明星