在'async'方法上达到'await'时线程会发生什么?

时间:2012-09-01 12:53:17

标签: c# multithreading asynchronous async-await ctp

标题建议我的问题是关于'异步'和'等待'的背景。

说当前线程到达'await'关键字是什么,它会转到“睡眠”, 当await方法完成后唤醒?

谢谢!

2 个答案:

答案 0 :(得分:19)

  

说当前线程到达'await'关键字是什么,它会进入“休眠”,并在await方法完成时唤醒,这是真的吗?

没有。 async的重点是避免让线程在进行其他工作时休眠。另外,如果运行async方法的线程是一个UI线程,那么真的根本不希望它处于休眠状态 - 您希望它可用于其他事件。

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

继续确保在等待值准备好时,其余的异步方法会运行。发生在哪个线程取决于您正在等待的上下文 - 如果异步方法在线程池线程中运行,则延续可以在与该方法启动的线程不同的线程上运行...但是不应该物。 (其余的上下文仍将传播。)

请注意,async方法在没有完成的情况下返回是很好的 - 因为异步方法不能直接返回值 - 它总是返回Task<T>(或Task或{{1只有当异步方法真正到达终点时,方法返回的任务才会完成。

答案 1 :(得分:2)

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

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