【发布时间】:2018-10-29 05:47:11
【问题描述】:
我是 c# 异步编程的新手,并且已经阅读了几篇关于它的好文章(参见 here、here 和 here 示例)。我想我对它的工作原理有所了解,但希望有人能确认我在正确的轨道上。
如果我理解正确的话,异步编程是这样工作的:
将关键字 async 添加到方法中,以表明它会离开并做自己的事情,而与程序的其余部分正在做的事情无关。这基本上就像厨师要求预备厨师去切蘑菇、洋葱和胡萝卜。
async 方法被分配给类型为 Task 的任务。 Task 是正在运行的方法,或者在我们的例子中是准备厨师。返回类型是任务将返回的类型。一旦分配了任务,当前方法就会忽略它,知道它正在处理。
await 命令是调用方法请求任务结果的地方。继续我们的例子,厨师向预备厨师要切碎的蔬菜。如果Task已经完成,则给出结果,调用方法继续运行。如果任务尚未完成,调用方法必须等待它完成。换句话说,如果在厨师需要蔬菜的时候准备厨师还没有完成切菜,那么厨师必须等待才能继续制作食谱。 (我知道,这个比喻在这里不成立,因为真正的厨师会去做其他事情,但这只是为了简化解释。)
要使用 await 命令,方法必须是异步方法。在上面的示例中,调用方法是异步方法。因此,当它遇到 await 命令时,控制会返回到它的调用方法,该方法将继续运行,直到它完成或遇到它自己的 await。
所以,我们现在得到的是方法 A 调用异步方法 B,该方法调用异步方法 C。方法 B 在 await 上停止,等待方法 C 的结果。方法 A 和 C 现在都在异步运行,而方法 B 正在等待结果。一旦方法 C 返回结果,然后方法 A 和 B 将异步运行,直到方法 B 完成,或者方法 A 决定它需要等待方法 B 的结果。请注意,方法 B 可能不需要返回结果,因此方法 A 可能在方法 B 之前完成。
这听起来对吗,或者控制会从 A 转到 B,然后只有在等待被命中时才返回 A?因此,如果 A 没有自己的等待,它将在控制权返回 B 之前完成。
我意识到在复杂性更高的地方我过于简单化了,但我试图在细节之前理解这些概念。
【问题讨论】:
标签: c# asynchronous async-await