繁体   English   中英

使用async / await / TPL这两个函数有什么区别?

[英]What is the difference between these two functions using async/await/TPL?

我想我已经成功地把自己弄糊涂了一天。

public void DoSomething1()
{
    Task.Delay(1000);
}

public async void DoSomething2()
{
    await Task.Delay(1000);
}

这两个函数在被调用时会发生什么变化有什么区别? 使用不返回Taskasync方法的目的是什么?

这两个函数在被调用时会发生什么变化有什么区别?

DoSomething1是一种同步方法。 因此:

  • 它启动异步延迟然后忽略它
  • 默认忽略异步延迟的任何异常。
  • DoSomething任何异常都会直接引发给调用者。

DoSomething2是一个异步void方法。 因此:

  • 它启动异步延迟然后观察它
  • DoSomething2开始执行时当前的SynchronizationContext上重新引发异步延迟的任何异常。 这通常会导致程序终止。
  • DoSomething2任何异常也会在SynchronizationContext上引发,结果相同。

使用不返回任务的异步方法的目的是什么?

async void并不是一件很自然的事情。 例如,F#中根本不存在等价物。 async void已添加到C#/ VB,以使事件处理程序变为异步,而无需更改整个事件处理或委派系统。

简而言之,您应该避免async void ,并且只将它们用于事件处理程序(或事件处理程序的逻辑等效项,如MVVM中的ICommand.Execute )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM