标题建议我的问题是关于'异步'和'等待'的背景。
说当前线程到达'await'关键字是什么,它会转到“睡眠”, 当await方法完成后唤醒?
谢谢!
盖
答案 0 :(得分:19)
说当前线程到达'await'关键字是什么,它会进入“休眠”,并在await方法完成时唤醒,这是真的吗?
没有。 async
的重点是避免让线程在进行其他工作时休眠。另外,如果运行async方法的线程是一个UI线程,那么真的根本不希望它处于休眠状态 - 您希望它可用于其他事件。
当执行到达await
表达式时,生成的代码将检查您正在等待的事物是否已经可用。如果是,你可以使用它并继续前进。否则,它会将延续添加到“等待”部分,并立即返回。
继续确保在等待值准备好时,其余的异步方法会运行。发生在哪个线程取决于您正在等待的上下文 - 如果异步方法在线程池线程中运行,则延续可以在与该方法启动的线程不同的线程上运行...但是不应该物。 (其余的上下文仍将传播。)
请注意,async方法在没有完成的情况下返回是很好的 - 因为异步方法不能直接返回值 - 它总是返回Task<T>
(或Task
或{{1只有当异步方法真正到达终点时,方法返回的任务才会完成。
答案 1 :(得分:2)
没有。当前线程实际上没有进入睡眠状态。执行继续。这是它的全部技巧。您可能有一些代码处理数据,而异步操作仍处于待处理状态。这意味着,当这些异步完成时,您的主线程可以自由运行并处理其他数据。
至于问题的其他部分 - 异步只在另一个线程上执行,而不是当前线程。我相信CLR负责旋转这些线程,因此允许同时执行许多异步操作(即,您可能同时从不同的Web服务器异步检索数据)。