我目前正在开发一个大型应用程序,它在C#中广泛使用async和await关键字。我们的IO调用几乎都是异步的。
当使用不等待的异步调用(无意中,因为开发人员忘记使用它)时,由于不等待结果,可能会遇到任务取消和其他不期望的行为。
例如。 doSomethingAsync().ConfigureAwait(false)
vs
await doSomethingAsync().ConfigureAwait(false)
有什么方法可以简洁地确定不等待正确等待的异步方法的用法吗?
理想情况下,我们可以进行单元测试(我们也使用DI)。简单的方法测试是不可靠的,因为完成的任务基本上变成了竞争条件,它经常成功,偶尔也会失败。
如果无法对此进行单元测试,是否有办法在质量上搜索和隔离这些实例?
有一个名为AsyncFixer的VS扩展,它试图提出建议。
https://marketplace.visualstudio.com/items?itemName=SemihOkur.AsyncFixer#qna
它可能会有所帮助,但遗憾的是无法找到这种模式:
Task t = DelayAndThrowAsync();
//永生难免!
您可以明确地执行此操作以使任务“消失”,并且在我的整个代码库异步之前它是一个可接受的停止间隙 - 但现在我几乎需要找到令人讨厌的未经任务的任务。
问题是TaskScheduler.UnobservedTaskException
实际上并没有告诉我违规任务在哪里: - /