可以在“使用”语句中使用异步方法的结果,例如:
using (await fooAsync())
{
...
}
不幸的是,容易犯此错误:
using (fooAsync())
{
...
}
并且一旦犯了这个错误,就很难发现。如果您找回的任务恰好完成,则Task.Dispose将成功完成。事实也证明是Task.Dispose does not call Task.Result.Dispose,因此您实际上希望通过“ using”语句保护的对象仍然悬空。
作为fooAsync的作者,防止错误被静默忽略的最佳方法是什么?
您只需要小心。
虽然Visual Studio通常会在不等待常规代码中的Task
的情况下警告您,但如果它是using
的主题,则不会警告您。例如:
正如您提到的,Task
确实实现了Task
,因此这是完全有效的代码。但是,如果您查看IDisposable
的代码,则在完成之前就将其丢弃Task.Dispose()
。
throw an exception
因此,虽然不能保证,但是很有可能在测试时会被该异常击中。