因此,众所周知,asp.net,WPF和WinRT等框架为您管理一个或多个线程。在asp.NET中,框架汇集了一组线程,这些线程从队列中获取请求并处理它们。在WPF中,框架为您管理UI线程,它从消息泵中获取消息。
这可以通过简单的生产者/消费者方法来实现,其中消费线程执行while(true)
循环,从队列中获取消息并使用消息处理程序(用户的代码)来执行它们。很简单。您可以在此处找到基本实施:https://stackoverflow.com/a/5828863/857807
通过引入async / await语义,您可以将CPU / IO密集型工作委托给其他某个线程,并使(例如)UI线程保持响应。这意味着UI线程将继续从泵中获取消息。
我的问题是:从上述基本实现开始,消费者将如何实现这一点?您如何知道消息处理程序异步等待另一个线程完成,因此从队列中获取另一条消息?我确定我在这里错过了一些大事。
答案 0 :(得分:3)
关键是当async
方法在await
中产生时,它实际上将返回给其调用者。因此,从主循环的角度来看,该方法已经完成。
稍后,当等待操作完成时,它会将async
方法的剩余部分安排到捕获的上下文中。在您提到的情况下(ASP.NET / WPF / WinRT),上下文是SynchronizationContext
。在UI框架(WPF / WinRT / WinForms / etc)中,SynchronizationContext
与消息队列绑定。
因此,如果你想要一个async
兼容的“主循环”,你需要实现一个自定义SynchronizationContext
,它允许将代理调度回主循环。
了解更多信息:
async
intro描述了async
和await
方法如何返回和捕获上下文。SynchronizationContext
MSDN article描述了该类型的相关部分,以及它在整个.NET框架中的使用方式。async
兼容的“主循环”,包括documentation,source和unit tests。