4

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

有没有一种简单的方法来扫描代码以查找缺少 await 的调用?

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

然后在某个地方我忘了使用等待;

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

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

4

7 回答 7

8

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

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

请参阅文档

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

于 2016-05-16T13:10:39.233 回答
5

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

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

出于这个原因,值得安装这个 nuget 包: https ://www.nuget.org/packages/Lindhart.Analyser.MissingAwaitWarning/

这将在不等待返回 Task 的方法的任何情况下发出警告

于 2020-08-06T23:46:34.217 回答
3

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

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

于 2016-05-16T13:11:02.390 回答
3

一个特例。答案仅适用于 JetBrains 的 Rider IDE。您可以使用 InspectCode,并在没有等待的情况下查找所有调用异步方法: 在此处输入图像描述

于 2021-10-11T16:19:02.900 回答
1

如果该方法甚至不包含一个 await 您可以检查输出窗口。编译后你会发现This async method lacks 'await' operators and will run synchronously ...警告。双击该警告将带您进入相关方法。

于 2016-05-16T13:10:52.037 回答
1

确实,您会收到警告,但是如果您的应用程序在不等待这些功能的情况下运行,也许您不想等待它们,只需将生成的任务分配给一个变量以关闭这些人告诉您的警告。

显然,这由您决定。

于 2016-05-16T13:19:49.657 回答
0

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

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

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

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

缺少异步等待文本搜索

于 2021-04-07T23:19:14.587 回答