如何保证.NET Core执行异步方法时不会遗漏await关键字

前言

在.NET Core 中已经广泛使用异步编程,代码中充斥着大量的 async 和 await 关键字。

但有时候,调用一个异步方法时可能会忘了写 await。.

这会造成什么问题呢?

问题重现

示例代码如下:

[HttpGet]
public async Task<IEnumerable<WeatherForecast>> Get()
{
    Demo();
    ...
}

private async Task Demo()
{
    await Task.Run(() =>
    {
        Console.WriteLine("My IO");
        throw new InvalidOperationException();
    });
}

调用Demo方法时没有加上 await 关键字。

在命令行下启动 API 并访问,发现 API 可以正常返回,控制台也有输出,但是却没有任何异常提示:

如何保证.NET Core执行异步方法时不会遗漏await关键字

因此,你可能认为Demo方法执行成功了,其实并没有。

解决方案

1.将警告视为错误

其实,VS 已经发现了问题,但是只是提出了警告:

如何保证.NET Core执行异步方法时不会遗漏await关键字

打开项目的属性窗口,在生成面板中找到“将警告视为错误”的选项,可以将其设置为所有,或者特别指定错误的编号:

如何保证.NET Core执行异步方法时不会遗漏await关键字

再次编译,就会编译失败了。

2.分析器

你也可以使用专门的分析器来检查这类错误。

首先,引用 Nuget 包 Lindhart.Analyser.MissingAwaitWarning

然后,找到对应的分析器,设置“严重性”为“错误”:

如何保证.NET Core执行异步方法时不会遗漏await关键字

再次编译,就会编译失败了。

如何保证.NET Core执行异步方法时不会遗漏await关键字

结论

现在,可以保证,执行异步方法时不会遗漏 await 关键字了。