我的服务器代码中有很多异步方法,但我怀疑我的调用者没有等待。
是否有一种简单的方法可以扫描代码以查找缺少等待的调用?
public async Task DomeSomethingAsync()
{
var result = await GetResult();
await StoreResult(result);
}
然后在某个地方我忘记使用await;
public async Task SomeBuggyCode()
{
await Initialize();
DoSomethingAsync(); // DOH - Forgot await
}
我希望有一种聪明的方法来识别这些错误的调用。
这应显示为编译器警告 CS4014,并带有文本:
由于不等待此调用,因此在调用完成之前将继续执行当前方法。考虑将“await”运算符应用于调用结果。
请参阅文档
因此您需要做的就是编译代码。 VS 应该允许您从其错误列表导航到相关位置。
如果编译器知道异步方法缺少“await”,则会生成 CS4014 警告。
如果在通过接口或外部库调用异步方法时错过了await,它将不起作用。
因此,值得安装这个 nuget 软件包: https://www.nuget.org/packages/Lindhart.Analyser.MissingAwaitWarning/
在任何未等待返回任务的方法的情况下,这都会引发警告
找到它们的最简单方法就是编译代码。
任何具有 async 但内部没有等待的函数都会导致 编译器警告 CS4014,一旦您编译项目,请查看警告列表,您将看到需要修复的所有函数。
如果该方法甚至不包含一个等待,您可以检查输出窗口。编译后你会发现
This async method lacks 'await' operators and will run synchronously ...
警告。双击该警告将带您进入相关方法。
确实,您会收到警告,但如果您的应用程序无需等待这些函数即可运行,也许您不想等待它们,只需将生成的任务分配给一个变量即可关闭这些人告诉您的警告。
显然这由你决定。
我注意到上面的警告仍然可能会错过缺少等待的地方,例如这一行:
var before = _repositoryBase.GetAsync(id).CloneJson();
如果您有一个命名约定,所有异步方法都称为 XXXAsync,以下正则表达式将帮助找到潜在的缺失等待:
^((?!(await|async)).)*Async\(
IMO,最好的方法是将其插入到
csproj
文件中:
<PropertyGroup>
<WarningsAsErrors>CS4014</WarningsAsErrors>
</PropertyGroup>