关于c#:在’async’方法上达到’await’时线程会发生什么?

What happens to the thread when reaching 'await' on 'async' method?

如标题所示,我的问题是关于"异步"和"等待"的背景。

如果说当前线程达到了"wait"关键字,那么它会进入"sleep",当等待方法完成后会醒来吗?

谢谢!

家伙


Is it true to say that what the current thread reaches 'await' keyword, it goes to"sleep", and wakes up when the await method is done?

不,async的关键是避免线程在执行其他工作时休眠。另外,如果运行async方法的线程是一个UI线程,那么您真的不希望它处于休眠状态—您希望它对其他事件可用。

当执行达到await表达式时,生成的代码将检查您等待的内容是否已经可用。如果是,你可以用它继续前进。否则,它将在"等待"部分添加一个延续,并立即返回。

continue确保在可等待的值准备就绪时运行异步方法的其余部分。在哪个线程中发生取决于您等待的上下文-如果异步方法在线程池线程中运行,则继续可以在与方法启动的线程不同的线程上运行…但这不重要。(上下文的其余部分仍将被传播。)

请注意,异步方法在未完成的情况下返回是可以的-因为异步方法不能直接返回值-它总是返回Task(或Taskvoid)。方法返回的任务只有在异步方法真正到达末尾时才能完成。


不,当前线程实际上没有进入睡眠状态。继续执行。这就是它的全部诀窍。您可能有一些代码在异步操作仍挂起时处理数据。这意味着当这些异步完成时,您的主线程可以自由运行和处理其他数据。

至于问题的另一部分-异步只是在另一个线程上执行,而不是当前线程。我相信clr负责旋转这些线程,以便同时允许许多异步操作(即,您可能同时从不同的Web服务器异步检索数据)。