关于C#异步编程流程的理解是否正确?
C#异步编程核心概念理解验证请求
我是C#异步编程的初学者,已经啃了好几篇优质的相关文章。自觉得摸透了它的工作原理,但还是想找过来人帮我验证下我的理解对不对,心里才踏实。
我对异步编程的理解:
- 给方法加上
async关键字,就相当于告诉程序“这个方法可以跟主线程各干各的”,类比的话就像厨师让配菜员去切蘑菇、洋葱和胡萝卜,自己继续做别的准备工作。 - 被标记为
async的方法会返回一个Task(或者Task<T>),这个Task就好比那个正在干活的配菜员,Task<T>里的T就是配菜员最终要递过来的“成果”类型。一旦把这个异步任务分配出去,当前调用它的方法不会傻等,会继续往下执行自己的代码,让任务在后台默默处理。 await关键字就是用来“取结果”的命令:如果Task已经完成了(配菜切好了),那就直接拿到结果继续走;如果还没完成,那当前方法就会暂停下来等它做完(不过这个“等”不是真的啥都不干,类比里厨师其实可以去擦个锅、摆个盘子,实际底层是把控制权交回给调用方)。- 用了
await的方法必须也标记成async。当一个方法碰到await的时候,它会把控制权还给自己的调用方,让调用方继续执行,直到调用方也碰到自己的await或者执行完。
基于以上理解的推论:
方法A调用异步方法B,B又调用异步方法C;当B因为await C而暂停时,A和C是在异步运行的;等C返回结果后,A和B又开始异步运行,直到B完成或者A需要await B的结果;如果B不需要返回结果,那A甚至可能在B干完之前就先结束了。
我的疑问:
上面这些理解和推论是对的吗?还是说,控制权从A到B之后,只有当B遇到await的时候才会把控制权还给A?如果A自己没有await的话,会不会在控制权回到B之前就先执行完了?
我知道自己做了不少简化,实际底层肯定更复杂,但我想先把核心概念搞扎实了再去抠细节。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

