【问题标题】:Find usages of async where await is not used in Visual Studio or Unit Test查找在 Visual Studio 或单元测试中未使用 await 的异步用法
【发布时间】:2018-09-12 13:03:03
【问题描述】:

我目前正在开发一个在 C# 中广泛使用 async 和 await 关键字的大型应用程序。我们的 IO 调用自始至终都是异步的。

使用不等待的异步调用时(无意中,因为开发人员忘记使用它),可能会遇到任务取消和其他不希望的行为,因为不等待结果。

例如doSomethingAsync().ConfigureAwait(false)vs

 await doSomethingAsync().ConfigureAwait(false)

有什么方法可以简洁地识别未正确等待的异步方法的用法?

理想情况下,我们可以对它进行单元测试(我们也始终使用 DI)。简单的方法测试是不可靠的,因为完成的任务本质上变成了一种竞争条件,它会经常成功,偶尔会失败。

如果无法对此进行单元测试,有没有办法大量搜索和隔离这些实例?

【问题讨论】:

  • async 方法中,未等待的任务显示为警告。
  • 只是想知道 resharper 是否可以做到?
  • @I3arnon,哦,酷,你是对的。所以,我只是看了一下,结果发现 Resharper 可以提供帮助。我可以告诉它在解决方案中识别该警告的任何实例,看起来它可以解决问题!我单击了一个实例旁边的 Resharper 灯泡,它位于该上下文菜单的选项中。
  • CS4014。 IE。 “警告 CS4014:由于未等待此调用,因此在调用完成之前继续执行当前方法。考虑将 'await' 运算符应用于调用结果。”
  • 最简单的方法可能是打开“将所有警告视为错误”。这将迫使您的团队清理他们的代码。 :)

标签: c# visual-studio async-await


【解决方案1】:

有一个名为 AsyncFixer 的 VS 扩展,它试图提出建议。

https://marketplace.visualstudio.com/items?itemName=SemihOkur.AsyncFixer#qna

这可能会有所帮助,但遗憾的是找不到此模式:

Task t = DelayAndThrowAsync(); // 从未等待过!

您可以明确地这样做以使任务“消失”,并且在我的整个代码库异步之前这是一个可以接受的权宜之计 - 但现在我需要找到有问题的未等待任务。

问题是TaskScheduler.UnobservedTaskException 实际上并没有告诉我违规任务在哪里:-/

【讨论】:

  • 这个扩展最终给了我错误的更正,所以我不得不卸载它。我完全忘记了它做了什么,但代码是合法的,它说它不是。
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2012-04-28
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多