2012-04-20 30 views
16

仍在学习关于异步等待。我碰到类似于以下示例:在最后一个方法行上等待

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    await Method02Async(); 
} 

最后等待的目的是什么? Method02Async是MethodAsync方法的最后一行。所以没有任何方法剩余部分 - 没有下面的任何代码行 - 在编译器生成的回调函数中没有任何东西需要调用......我错过了什么吗?

回答

17

实际上有一个“方法余数” - 它完成由MethodAsync返回的Task

(返回值)Method02Async正在等待,所以MethodAsync没有完成,直到Method02Async完成。

如果您有:

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    Method02Async(); 
} 

然后MethodAsync会(异步)等待Method01Async完成,然后开始Method02Async。然后MethodAsync将完成,而Method02Async可能仍在进行中。

你有它的方式:

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    await Method02Async(); 
} 

就是说MethodAsync会(异步)等待Method01Async完成,然后(异步)等待Method02Async完成,只有这样,MethodAsync完整。

+5

特别想象一下,如果Method02Async是Task.Delay(5000)。如果有人说“等待MethodAsync()”,然后在完成延迟之前完成该任务,那将会非常奇怪! – 2012-04-20 14:57:18

+0

但是写出“返回Method02Async();”是不是更好?“作为最后一行? – duduamar 2016-02-21 09:27:30

+0

@duduamar:除非您从'MethodAsync'中移除'async',否则无法编译。这意味着你必须从'Method01Async'中删除'await'。行为有相当大的变化。 – 2016-02-22 03:23:08

相关问题