我想我已经成功地把自己弄糊涂了一天。
public void DoSomething1()
{
Task.Delay(1000);
}
public async void DoSomething2()
{
await Task.Delay(1000);
}
这两个函数在被调用时会发生什么变化有什么区别?使用不返回async
的<{1}}方法的目的是什么?
答案 0 :(得分:6)
这两个函数在被调用时会发生什么变化有什么区别?
DoSomething1
是一种同步方法。就这样:
DoSomething
的任何例外都会直接提交给来电者。 DoSomething2
是一种异步void
方法。就这样:
SynchronizationContext
开始执行时的当前DoSomething2
上重新引发。这通常会导致程序终止。DoSomething2
的任何例外情况也会在SynchronizationContext
上提出,结果相同。使用不返回任务的异步方法的目的是什么?
async void
不是自然而然的事。例如,F#中根本不存在等价物。 {C} / VB中添加了async void
以使事件处理程序变为异步,而无需更改整个事件处理或委派系统。
简而言之,您应该避免async void
,并且只将它们用于事件处理程序(或事件处理程序的逻辑等效项,如MVVM中的ICommand.Execute
)。