异步/等待的呼叫链...等待等待或返回等待?

时间:2017-12-03 23:05:32

标签: c# asynchronous async-await

给出异步方法:

public async Task<int> InnerAsync()
{
    await Task.Delay(1000);
    return 123;
}

通过中间方法调用它,中间方法是等待异步方法IntermediateA还是只返回任务IntermediateB

public async Task<int> IntermediateA()
{
    return await InnerAsync();
}

private Task<int> IntermediateB()
{
    return InnerAsync();
}

最好我可以告诉调试器,两者看起来完全相同,但在我看来,IntermediateB应该通过避免在状态机中等待一个等待条目来表现更好。

是吗?

1 个答案:

答案 0 :(得分:6)

这两种方法存在细微差别。如果await任务失败,则该异常将在该方法中抛出,但如果您认为该方法然后await认为该方法,那么异常将在consumer方法中抛出。另一个区别是更罕见的,在消费者等待任务的情况下,如果它发生延迟,则任务可以在等待点完成并绕过状态机。