没有等待的异步方法

时间:2017-10-31 06:59:46

标签: .net .net-core

在异步方法中没有await运算符的“分支”是否正确?

    public async Task<Person> GetName(string name)
    {
        if (string.IsNullOrWhiteSpace(name))
        {
            return null;
        }
        return await _database.Logins.FirstOrDefaultAsync(i => i.Name.Contains(name));
    }

Asynchronous programming

  

异步方法需要在其正文中使用await关键字,否则它们会   从不屈服!

     

如果在异步方法的主体中没有使用await,那么C#   编译器会生成一个警告,但代码将编译并运行为   如果这是一种正常的方法。请注意,这也是令人难以置信的   低效

这是否适用于我的方法,因为它包含await,但不适用于每个分支

谢谢!

2 个答案:

答案 0 :(得分:3)

是的,在async方法中有一些实际上是同步的路径是完全可以接受的。

您通常只希望拥有这样的路径(如您的样本中所示),快速&#34;成功/失败的路径,它只是&#34;慢&#34;使用await实际可以获益的路径。

答案 1 :(得分:3)

如果您有async个装饰方法,那么编译器会将null转换为Task.FromResult<Person>(null)

如果你的方法在它的主体中有一个await,那么编译器实际上会生成一个类,它是一个跟踪所有await延续的状态机,所以你的代码在每个后都按预期运行你等待的任务完成。状态机类将保留所有变量和堆栈。