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

时间:2016-01-26 20:50:23

标签: c# asynchronous task-parallel-library

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

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

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

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

1 个答案:

答案 0 :(得分:6)

  

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

DoSomething1是一种同步方法。就这样:

  • 启动异步延迟,然后忽略它
  • 默认忽略异步延迟的任何异常。
  • DoSomething的任何例外都会直接提交给来电者。

DoSomething2是一种异步void方法。就这样:

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

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

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

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