这是异步的正确图表
我将尝试就async
await
进行讨论,并创建一个流程图,试图显示可能的执行顺序。
我试图从段落中找出它
异步方法的开始与其他方法一样执行。 也就是说,它同步运行,直到它遇到“等待”(或抛出异常)。
“await”关键字是事物可以异步的地方。 等待就像一个一元运算符:它只需要一个参数,一个等待(一个“awaitable”是一个异步操作)。 等待检查,看看它是否已经完成; 如果awaitable已经完成,那么方法会继续运行(同步,就像常规方法一样)。
如果“等待”看到等待时间没有完成,那么它将异步执行。 它告诉等待完成时运行方法的其余部分,然后从异步方法返回。
稍后,等待完成时,它将执行异步方法的其余部分。 如果您正在等待内置的等待时间(例如任务),则异步方法的其余部分将在“await”返回之前捕获的“上下文”上执行。
来自http://blog.stephencleary.com/2012/02/async-and-await.html
usr的答案基本上是正确的,尽管我认为它在线程和任务之间形成了太强的类比。 任务不需要像另一个线程那样。 请记住,线程是工作者,任务就是工作。 你可以在你的待办事项列表上有一百件事情,而不需要雇佣任何工作人员去做。 尽量不要将任务视为轻量级工作者,因为他们不是。 他们是需要完成的工作; 他们的工作是由交给你任务的代码决定的。
你的图表开始很好,但它在“完成所有独立工作吗? 调用者的延续是,无论它是什么。 如果这种延续涉及到工作,它确实有效。 其中一些工作可能是安排在当前线程上运行的任务。 其中一些工作可能会保持UI的响应。
另外,不要忘记调用者的线程可以被终止,并且任务的继续可以被调度到另一个线程。
在这里可以发生许多事情, 如果不知道调用者究竟做了什么以及调用者的线程环境是什么,就不可能说出等待返回后立即发生的事情。
这个
含糊不清,看起来不正确。
在async方法中接下来发生的事情不依赖于调用者。 该方法现在是独立运行的独立代理(如线程)。 这又回到一个Task
是指向自身的句柄。 来电者可以随心所欲地执行该任务(例如等待,等待,...)。
但是,如果调用者只是放弃该任务,则异步方法将继续运行。
图片的“重新进入”部分发生在等待等待的时间。 通常,这是一些外部事件,例如完成的IO或计时器。 异步方法现在恢复执行,不知道或关心谁重新激活它。
把每个异步方法看作一个独立的线程。 每个逻辑上await
一个Thread.Join()
。
上一篇: Is this a correct diagram of how async
下一篇: Awaiting an empty Task spins forever (await new Task(() => { }))