【问题标题】:Find missing await in solution在解决方案中查找缺少的等待
【发布时间】:2021-10-12 00:19:02
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • @Frode:Roslyn 是不是特别需要?或找到它们的任何合理方法都可以吗?如果您不需要 Roslyn,请将其从问题中删除,这样可以清楚地表明 Charles 的回答很好
  • 很高兴知道。当长时间使用 resharper 时,你开始搞乱它做了什么,什么没有:)

标签: c# .net asynchronous async-await roslyn-code-analysis


【解决方案1】:

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

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

the documentation

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

【讨论】:

  • 这显然是最好的方法。我没有收到此警告的原因是因为我有返回 Task 但不是异步的函数。由于某种原因,我刚刚返回了 Task.CompletedTask。现在让它们异步。
  • 将方法标记为“async”告诉编译器该方法实现是异步的,并且允许在其中等待。从方法外部看不到“异步”特性,判断方法是否异步的最佳方法是方法返回任务时。如果您的项目包含异步方法和调用者,那么编译器会警告您。但是如果异步方法在其他程序集中(甚至是 BCL),编译器可能无法警告您。所以这个答案大部分是正确的,但对于异步方法在外部程序集中的情况可能是错误的。
【解决方案2】:

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

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

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

如果返回任务的方法没有等待,这将引发警告

【讨论】:

    【解决方案3】:

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

    任何具有异步但内部没有等待的函数都会导致compiler warning CS4014,一旦你编译你的项目,查看警告列表,你会看到所有需要修复的函数。

    【讨论】:

      【解决方案4】:

      一种特殊情况。答案仅适用于 JetBrains 的 Rider IDE。 您可以使用 InspectCode,并在不等待的情况下查找所有调用异步方法:

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          显然,这由您决定。

          【讨论】:

            【解决方案7】:

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

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

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

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

            Missing async await text search

            【讨论】:

              猜你喜欢
              • 2012-12-05
              • 2016-06-08
              • 2023-01-30
              • 2011-05-05
              • 1970-01-01
              • 1970-01-01
              • 2022-10-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多