重用一个等待的线程

时间:2013-11-27 14:21:37

标签: c# .net multithreading task-parallel-library async-await

因此,众所周知,asp.net,WPF和WinRT等框架为您管理一个或多个线程。在asp.NET中,框架汇集了一组线程,这些线程从队列中获取请求并处理它们。在WPF中,框架为您管理UI线程,它从消息泵中获取消息。

这可以通过简单的生产者/消费者方法来实现,其中消费线程执行while(true)循环,从队列中获取消息并使用消息处理程序(用户的代码)来执行它们。很简单。您可以在此处找到基本实施:https://stackoverflow.com/a/5828863/857807

通过引入async / await语义,您可以将CPU / IO密集型工作委托给其他某个线程,并使(例如)UI线程保持响应。这意味着UI线程将继续从泵中获取消息。

我的问题是:从上述基本实现开始,消费者将如何实现这一点?您如何知道消息处理程序异步等待另一个线程完成,因此从队列中获取另一条消息?我确定我在这里错过了一些大事。

1 个答案:

答案 0 :(得分:3)

关键是当async方法在await中产生时,它实际上返回给其调用者。因此,从主循环的角度来看,该方法已经完成。

稍后,当等待操作完成时,它会将async方法的剩余部分安排到捕获的上下文中。在您提到的情况下(ASP.NET / WPF / WinRT),上下文是SynchronizationContext。在UI框架(WPF / WinRT / WinForms / etc)中,SynchronizationContext与消息队列绑定。

因此,如果你想要一个async兼容的“主循环”,你需要实现一个自定义SynchronizationContext,它允许将代理调度回主循环。

了解更多信息: