Visual Studio 会针对此代码发出警告(“因为未等待此调用,因此在调用完成之前将继续执行当前方法”)。
static void Main(string[] args)
{
FireAndForget(); // <-- Warning CS4014
// Do something else.
}
static async Task FireAndForget()
{
// Do something (cannot throw).
}
我的理解是,在这种特殊情况下不等待任务是可以的,因为 FireAndForget 永远不会抛出异常。
我没有考虑使用编译指示禁用警告,而是考虑将 FireAndForget 的返回类型从 Task 更改为 void。这有效地使编译器保持沉默。
static async void FireAndForget() // <-- Task changed to void
{
// Do something (cannot throw).
}
然而,根据斯蒂芬·克利里,应该避免使用“async void”方法,所以我不太确定该怎么做。
如果该方法最初没有被设计为可等待并且不会抛出异常,那么使用“async void”方法是否可以?
It's 极其很少有真正的“即发即忘”操作;也就是说,一个操作:
- 没有人关心它什么时候完成。
- 没有人关心它是否完成。
- 没有人关心它是否抛出异常。
特别是最后一个;大多数所谓的“即发即弃”操作实际上并不是“即发即弃”操作,因为如果不成功就需要采取一些行动。
也就是说,在某些情况下,真正的“一劳永逸”是适用的。
我更喜欢使用async Task
并通过将任务分配给其他未使用的变量来避免编译器警告:
var _ = FireAndForget();
async Task
方法比方法更可重用和可测试async void
方法。
但是,如果我团队中的开发人员只是使用async void
反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)