关于多层连续await语句与ContinueWith嵌套代码中各await作用的疑问
关于多层连续await语句与ContinueWith嵌套代码中各await作用的疑问
哈哈这段嵌套的Task和连续await确实容易绕晕,我来帮你逐层掰明白每个await在干嘛:
先从变量s的生成过程拆解,把每一步的Task类型理清楚:
- 第一步:
Task.FromResult(true)生成的是一个已经完成的**Task<bool>**(我们暂时叫它T0),它的结果就是true。 - 第一个
ContinueWith(async t => t):- 这里的委托是
async修饰的,它接收前一个任务T0作为参数,直接返回T0。但async委托会把返回值再包装一层,所以这个委托本身的返回值是**Task<Task<bool>>**。 - 而
ContinueWith方法又会把这个委托的执行结果再包一层,所以这一步最终得到的是**Task<Task<Task<bool>>>**(叫它T1)。
- 这里的委托是
- 第二个
ContinueWith(async t => t):- 这次它接收的是
T1(Task<Task<Task<bool>>>),同样async委托返回T1后会被包装成**Task<Task<Task<Task<bool>>>>**。 - 再经过
ContinueWith的一层包装,最终变量s的类型就是**Task<Task<Task<Task<Task<bool>>>>>**——整整5层Task嵌套!
- 这次它接收的是
现在再看那串await await await await await s;,每个await的核心作用就是解包一层Task,拿到它内部包装的下一层Task(或者最终结果):
- 第一个
await s:解包最外层的Task,得到内部的Task<Task<Task<Task<bool>>>> - 第二个
await:解包这一层,得到Task<Task<Task<bool>>> - 第三个
await:解包后得到Task<Task<bool>> - 第四个
await:解包后得到最接近结果的Task<bool> - 第五个
await:终于解包到最内层,拿到最终的bool值true
简单来说,每多一层嵌套的Task,就需要多一个await来“拆”到你想要的结果~
备注:内容来源于stack exchange,提问作者Shuumi
相关产品推荐
相关产品推荐

