gpt4 book ai didi

c# - 是否可以将异步方法声明为返回 void 以使 CS4014 警告静音?

转载 作者:太空狗 更新时间:2023-10-29 17:43:08 26 4
gpt4 key购买 nike

Visual Studio 针对此代码发出警告(“因为未等待此调用,当前方法的执行在调用完成之前继续”)。

static void Main(string[] args)
{
FireAndForget(); // <-- Warning CS4014
// Do something else.
}

static async Task FireAndForget()
{
// Do something (cannot throw).
}

我的理解是在这种特殊情况下不等待任务是可以的,因为 FireAndForget 永远不会抛出异常。

我没有使用 pragma 禁用警告,而是考虑将 FireAndForget 的返回类型从 Task 更改为 void。这有效地使编译器静音。

static async void FireAndForget() // <-- Task changed to void
{
// Do something (cannot throw).
}

然而,根据Stephen Cleary ,应避免使用“async void”方法,因此我不太确定该怎么做。

如果方法一开始就不是可等待的并且不会抛出异常,那么使用“async void”方法是否可以?

最佳答案

极其很少有真正的即发即弃操作;也就是说,一个操作:

  • 没有人关心它何时完成。
  • 没有人关心它是否完成。
  • 没有人关心它是否抛出异常。

特别是最后一个;大多数所谓的“即发即弃”操作实际上并不是即发即弃,因为如果不成功就需要采取一些行动。

也就是说,在某些情况下真正的即发即弃适用。

我更喜欢使用 async Task 并通过将任务分配给其他未使用的变量来避免编译器警告:

var _ = FireAndForget();

async Task 方法比 async void 方法更具可重用性和可测试性。

但是,如果我团队中的开发人员只是使用 async void 而不是,我不会发脾气。

关于c# - 是否可以将异步方法声明为返回 void 以使 CS4014 警告静音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com