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

我将尝试发表关于async的讨论 – await ,我正在创建一个试图显示可能的执行顺序的流程图。

在此处输入图像描述

我试图将其作为段落的基础

异步方法的开始就像任何其他方法一样执行。 也就是说,它会同步运行,直到遇到“await”(或抛出exception)。

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

如果“等待”看到等待尚未完成,那么它将异步行动。 它告诉等待在完成时运行方法的其余部分,然后从异步方法返回。

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

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

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

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

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

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

这个

在此处输入图像描述

是模糊的,似乎不正确。

async方法中接下来发生的事情不依赖于调用者。 该方法现在是一个独立的代理(如一个线程),它自己运行。 它返回了一个Task ,它是一个自己的句柄。 调用者可以随心所欲地执行该任务(例如,等待它,等待它,……)。

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

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

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