在解决方案中找到缺少的await

问题描述 投票:0回答:8

我的服务器代码中有很多异步方法,但我怀疑我的调用者没有等待。

是否有一种简单的方法可以扫描代码以查找缺少等待的调用?

public async Task DomeSomethingAsync() 
{
     var result = await GetResult();
     await StoreResult(result);
}

然后在某个地方我忘记使用await;

public async Task SomeBuggyCode()
{
     await Initialize();
     DoSomethingAsync();  // DOH - Forgot await
}

我希望有一种聪明的方法来识别这些错误的调用。

c# .net asynchronous async-await roslyn-code-analysis
8个回答
11
投票

这应显示为编译器警告 CS4014,并带有文本:

由于不等待此调用,因此在调用完成之前将继续执行当前方法。考虑将“await”运算符应用于调用结果。

请参阅文档

因此您需要做的就是编译代码。 VS 应该允许您从其错误列表导航到相关位置。


10
投票

如果编译器知道异步方法缺少“await”,则会生成 CS4014 警告。

如果在通过接口或外部库调用异步方法时错过了await,它将不起作用。

因此,值得安装这个 nuget 软件包: https://www.nuget.org/packages/Lindhart.Analyser.MissingAwaitWarning/

在任何未等待返回任务的方法的情况下,这都会引发警告


5
投票

特殊情况。答案仅适用于 JetBrains 的 Rider IDE。 您可以使用 InspectCode,并找到所有调用异步方法而无需等待的情况: enter image description here


3
投票

找到它们的最简单方法就是编译代码。

任何具有 async 但内部没有等待的函数都会导致 编译器警告 CS4014,一旦您编译项目,请查看警告列表,您将看到需要修复的所有函数。


1
投票

如果该方法甚至不包含一个等待,您可以检查输出窗口。编译后你会发现

This async method lacks 'await' operators and will run synchronously ...
警告。双击该警告将带您进入相关方法。


1
投票

确实,您会收到警告,但如果您的应用程序无需等待这些函数即可运行,也许您不想等待它们,只需将生成的任务分配给一个变量即可关闭这些人告诉您的警告。

显然这由你决定。


1
投票

我注意到上面的警告仍然可能会错过缺少等待的地方,例如这一行:

var before = _repositoryBase.GetAsync(id).CloneJson();

如果您有一个命名约定,所有异步方法都称为 XXXAsync,以下正则表达式将帮助找到潜在的缺失等待:

^((?!(await|async)).)*Async\(

缺少异步等待文本搜索


0
投票

IMO,最好的方法是将其插入到

csproj
文件中:

<PropertyGroup>
    <WarningsAsErrors>CS4014</WarningsAsErrors>
</PropertyGroup>
© www.soinside.com 2019 - 2024. All rights reserved.