繁体   English   中英

重用等待线程

[英]Reuse an awaiting thread

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

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

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

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

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

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

因此,如果要使用async兼容的“主循环”,则需要实现一个自定义的SynchronizationContext ,以允许将委托调度回该主循环。

欲获得更多信息:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM