C# 这是async await工作原理的正确示意图吗?

C# 这是async await工作原理的正确示意图吗?,c#,.net,multithreading,asynchronous,async-await,C#,.net,Multithreading,Asynchronous,Async Await,我将尝试做一个关于async-wait的演讲,我正在创建一个流程图,试图显示可能的执行顺序 我试图以段落为基础 异步方法的开头与其他方法一样执行 方法。也就是说,它同步运行,直到遇到“等待”(或 抛出异常) “wait”关键字是事情可以异步的地方。等待是 就像一元运算符:它只接受一个参数,一个等待的(一个 “等待”是一种异步操作)。等待检验 等待着看它是否已经完成;如果等待已久 已完成,则该方法将继续运行 (同步地,就像常规方法一样) 如果“等待”看到等待尚未完成,则它将执行操作 异步的。它告

我将尝试做一个关于
async
-
wait
的演讲,我正在创建一个流程图,试图显示可能的执行顺序

我试图以段落为基础

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

“wait”关键字是事情可以异步的地方。等待是 就像一元运算符:它只接受一个参数,一个等待的(一个 “等待”是一种异步操作)。等待检验 等待着看它是否已经完成;如果等待已久 已完成,则该方法将继续运行 (同步地,就像常规方法一样)

如果“等待”看到等待尚未完成,则它将执行操作 异步的。它告诉等待的用户运行剩余的 方法,然后从异步方法返回

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

从这个

是模糊的,似乎不正确

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

但是,如果调用方简单地放弃该任务,异步方法将继续运行

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


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

usr的答案基本上是正确的,尽管我认为它在线程和任务之间做了太强的类比。一个任务不需要像另一个线程那样。记住,线程是工作者,任务是作业。你可以在你的待办事项清单上有一百件事,而不需要雇佣任何工人去做。尽量不要把任务看作是轻量级的工作者,因为它们不是。它们是需要完成的工作;工人做什么取决于交给你任务的代码

您的关系图一开始很好,但在“调用者是否完成了所有独立的工作?”时就偏离了轨道。调用者的延续是,不管它是什么。如果这种延续涉及到做功,那么它就起作用了。其中一些工作可能是安排任务在当前线程上运行。其中一些工作可能是保持UI的响应性

另外,不要忘记调用方的线程可以被终止,任务的继续可以被安排到另一个线程


这里会发生很多很多事情;如果不了解调用者具体在做什么以及调用者的线程上下文是什么,就不可能说出等待返回后立即发生的事情。

顺便说一句,方法可以是同步的,也可以是异步的,而且仍然可以是可等待的。你认为谈论一些你不太了解的事情是明智的吗?关于这一特征已经有大量的错误信息和模糊思维;我不确定你是否想创造更多。看,从。你解释中的模糊和挥手来自于对日程安排的模糊。例如,考虑一个WiFrm应用程序。认为有办法“完成所有独立工作”的想法应该让你产生深深的怀疑;这项工作可以通过计时器的滴答声、鼠标的瞬间、按键或按钮的点击来安排。如果将来的工作是通过按键完成的,你怎么知道“所有的工作”都完成了?如果您不清楚Windows是如何处理事件的,那么您就无法理解winforms中的异步。虽然这让人明白了这一点,但实际上最好不要将任务(需要完成的工作)与线程(执行任务的工作人员)混为一谈。异步工作流中等待的是连接点,这是一个重要的见解,但我认为过于强调线程作为考虑异步的默认机制。