异步等待-什么时候返回Task vs void?

异步等待-什么时候返回Task vs void?,第1张

异步/等待-什么时候返回Task vs void?

1)通常,您需要返回

Task
。主要的例外应该是当您 需要
具有
void
返回类型(用于事件)时。如果没有理由不允许调用者执行
await
您的任务,为什么要禁止它呢?

2)

async
返回的方法
void
在另一方面是特殊的:它们代表 顶级异步 *** 作
,并且在您的任务返回异常时会起作用。最简单的方法是通过一个示例来显示差异:

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));}

是的,请使用

async
await
在这里,它们可以确保如果引发异常,您的方法仍然可以正常工作。

有关更多信息,请参见:http :
//msdn.microsoft.com/zh-
cn/magazine/jj991977.aspx



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5441109.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存