如何处理异步“使用”语句陷阱?

问题描述 投票:3回答:1

可以在“使用”语句中使用异步方法的结果,例如:

using (await fooAsync())
{
    ...
}

不幸的是,容易犯此错误:

using (fooAsync())
{
    ...
}

并且一旦犯了这个错误,就很难发现。如果您找回的任务恰好完成,则Task.Dispose将成功完成。事实也证明是Task.Dispose does not call Task.Result.Dispose,因此您实际上希望通过“ using”语句保护的对象仍然悬空。

作为fooAsync的作者,防止错误被静默忽略的最佳方法是什么?

c# async-await using
1个回答
0
投票

您只需要小心。

虽然Visual Studio通常会在不等待常规代码中的Task的情况下警告您,但如果它是using的主题,则不会警告您。例如:

Lacking await

正如您提到的,Task确实实现了Task,因此这是完全有效的代码。但是,如果您查看IDisposable的代码,则在完成之前就将其丢弃Task.Dispose()

throw an exception

因此,虽然不能保证,但是很有可能在测试时会被该异常击中。

© www.soinside.com 2019 - 2024. All rights reserved.