是否可以将异步方法声明为返回 void 以消除 CS4014 警告?

2023-11-23

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(使用前将#替换为@)

是否可以将异步方法声明为返回 void 以消除 CS4014 警告? 的相关文章

随机推荐