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

KDe*_*ker 3 c# asynchronous task-parallel-library

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

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

public async void DoSomething2()
{
    await Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ary 6

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

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

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

DoSomething2是一种异步void方法.因此:

  • 它启动异步延迟然后观察它.
  • 异步延迟的任何异常都会SynchronizationContextDoSomething2开始执行时的当前时间上重新引发.这通常会导致程序终止.
  • 从任何异常DoSomething2,也提出了对SynchronizationContext,具有相同的结果.

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

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

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