这是async-await如何工作的正确图表吗?

时间:2016-12-11 20:31:01

标签: c# .net multithreading asynchronous async-await

我将尝试在async - await上发表演讲,我正在创建一个试图显示可能的执行顺序的流程图。

enter image description here

我试图将其基于段落

  

异步方法的开头就像执行其他方法一样   方法。也就是说,它同步运行,直到它达到“等待”(或   抛出异常)。

     

“await”关键字是事物可以异步的地方。等待是   就像一元运算符:它需要一个参数,一个等待的(一个   “等待”是一种异步操作)。等待检查   等待看它是否已经完成;如果等待的话   已经完成,然后该方法继续运行   (同步,就像常规方法一样)。

     

如果“等待”看到等待尚未完成,那么它就会行动起来   异步。它告诉等待运行剩余的   完成后的方法,然后从异步方法返回。

     

稍后,当等待完成时,它将执行剩余部分   异步方法。如果你正在等待内置的等待(例如   任务),然后异步方法的其余部分将在a上执行   在“等待”返回之前捕获的“上下文”。

来自http://blog.stephencleary.com/2012/02/async-and-await.html

2 个答案:

答案 0 :(得分:2)

usr的答案基本上是正确的,尽管我认为它在线程和任务之间做了太强有力的比喻。任务不必像其他线程那样。记住,线程是工人,任务是工作。你可以在你的待办事项清单上有一百件事情,而不雇用任何工人来做这些事情。尽量不要将任务视为轻量级工作者,因为它们不是。他们是需要完成的工作;工作人员做什么取决于交给你任务的代码。

你的图表开始很好,但是在“调用者完成所有独立工作吗?无论是什么,呼叫者的延续都是如此。如果继续涉及做工作,它确实有效。其中一些工作可能是安排在当前线程上运行的任务。其中一些工作可能是保持用户界面的响应。

另外,不要忘记可以终止调用者的线程,并且可以将任务的继续安排到另一个线程。

这里可能发生很多很多事情;如果不了解调用者究竟在做什么以及调用者的线程上下文是什么,就不可能说明await返回后会发生什么。

答案 1 :(得分:1)

enter image description here

含糊不清,似乎不正确。

内部内部发生的事情async方法不依赖于调用者。该方法现在是一个独立的代理(如一个线程),它自己运行。它已返回一个Task,它是自己的句柄。呼叫者可以随心所欲地完成该任务(例如,等待它,等待它,......)。

但是如果调用者只是删除了该Task,则异步方法会继续运行。

你的照片中的“重新进入”部分发生在等待等待的时间。通常,这是一些外部事件,例如已完成的IO或计时器。异步方法现在恢复执行,不知道或关心谁重新激活它。

将每个异步方法视为一个独立的线程。每个await逻辑上都是Thread.Join()