gpt4 book ai didi

c# - async/await - 何时返回 Task 与 void?

转载 作者:IT王子 更新时间:2023-10-29 03:27:36 28 4
gpt4 key购买 nike

在什么场景下使用

public async Task AsyncMethod(int num)

代替

public async void AsyncMethod(int num)

我能想到的唯一场景是,如果您需要任务能够跟踪其进度。

另外,在下面的方法中,async 和 await 关键字是不是就不需要了?

public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}

最佳答案

  1. 通常,您会想要返回一个Task。主要的异常(exception)应该是当您需要 有一个void 返回类型(对于事件)。如果没有理由禁止调用者等待您的任务,为什么要禁止呢?

  2. 返回 void
  3. async 方法在另一方面是特殊的:它们代表顶级异步操作,并且有额外的规则当您的任务返回异常时,它们就会发挥作用。最简单的方法是通过示例显示差异:

static async void f()
{
await h();
}

static async Task g()
{
await h();
}

static async Task h()
{
throw new NotImplementedException();
}

private void button1_Click(object sender, EventArgs e)
{
f();
}

private void button2_Click(object sender, EventArgs e)
{
g();
}

private void button3_Click(object sender, EventArgs e)
{
GC.Collect();
}

f 的异常总是被“观察到”。离开顶级异步方法的异常被简单地视为任何其他未处理的异常。 g 的异常从未被观察到。当垃圾收集器来清理任务时,它看到任务产生了异常,并且没有人处理异常。当发生这种情况时,TaskScheduler.UnobservedTaskException 处理程序运行。你不应该让这种情况发生。要使用您的示例,

public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}

是的,在这里使用 asyncawait,它们确保您的方法在抛出异常时仍能正常工作。

有关详细信息,请参阅:https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming

关于c# - async/await - 何时返回 Task 与 void?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12144077/

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