C# 重用等待线程
因此,众所周知,像asp.NET、WPF和WinRT这样的框架为您管理一个或多个线程。在asp.NET中,框架汇集了一组线程,这些线程从队列中获取请求并进行处理。在WPF中,框架为您管理UI线程,它从消息泵获取消息 这可以通过简单的生产者/消费者方法实现,其中消费线程执行C# 重用等待线程,c#,.net,multithreading,task-parallel-library,async-await,C#,.net,Multithreading,Task Parallel Library,Async Await,因此,众所周知,像asp.NET、WPF和WinRT这样的框架为您管理一个或多个线程。在asp.NET中,框架汇集了一组线程,这些线程从队列中获取请求并进行处理。在WPF中,框架为您管理UI线程,它从消息泵获取消息 这可以通过简单的生产者/消费者方法实现,其中消费线程执行while(true)循环,从队列中获取消息并使用消息处理程序(用户代码)执行它们。很简单。您可以在此处找到一个基本实现: 通过引入async/await语义,您可以将CPU/IO密集型工作委托给其他线程,并使(例如)UI线程保
while(true)
循环,从队列中获取消息并使用消息处理程序(用户代码)执行它们。很简单。您可以在此处找到一个基本实现:
通过引入async/await语义,您可以将CPU/IO密集型工作委托给其他线程,并使(例如)UI线程保持响应。这意味着UI线程将继续从泵获取消息
我的问题是:从上述基本实现开始,消费者将如何实现这一点?您如何知道消息处理程序正在异步等待另一个线程完成,从而从队列中获取另一条消息?我确信我在这里遗漏了一些重要的东西。关键是当一个
异步
方法在等待
中产生时,它实际上会返回给它的调用者。因此,从主循环的角度来看,该方法已经完成
稍后,当等待操作完成时,它将async
方法的其余部分调度到捕获的上下文中。在您提到的案例中(ASP.NET/WPF/WinRT),上下文是一个SynchronizationContext
。在UI框架(WPF/WinRT/WinForms/etc)中,SynchronizationContext
绑定到消息队列
因此,如果您想要一个与异步
兼容的“主循环”,则需要实现一个自定义的同步上下文
,该上下文允许将代理调度回该主循环
有关更多信息:
- My描述了
和async
方法如何返回和捕获上下文await
- My描述了该类型的相关部分,以及如何在整个.NET框架中使用它
- My有一个与异步兼容的“主循环”,包括和
异步
方法在等待中产生时,它实际上会返回给它的调用者。因此,从主循环的角度来看,该方法已经完成
稍后,当等待操作完成时,它将async
方法的其余部分调度到捕获的上下文中。在您提到的案例中(ASP.NET/WPF/WinRT),上下文是一个SynchronizationContext
。在UI框架(WPF/WinRT/WinForms/etc)中,SynchronizationContext
绑定到消息队列
因此,如果您想要一个与异步
兼容的“主循环”,则需要实现一个自定义的同步上下文
,该上下文允许将代理调度回该主循环
有关更多信息:
- My描述了
async
和await
方法如何返回和捕获上下文
- My描述了该类型的相关部分,以及如何在整个.NET框架中使用它
- My有一个与异步兼容的“主循环”,包括和
关键在于,当异步
方法在等待中产生时,它实际上会返回给它的调用者。因此,从主循环的角度来看,该方法已经完成
稍后,当等待操作完成时,它将async
方法的其余部分调度到捕获的上下文中。在您提到的案例中(ASP.NET/WPF/WinRT),上下文是一个SynchronizationContext
。在UI框架(WPF/WinRT/WinForms/etc)中,SynchronizationContext
绑定到消息队列
因此,如果您想要一个与异步
兼容的“主循环”,则需要实现一个自定义的同步上下文
,该上下文允许将代理调度回该主循环
有关更多信息:
- My描述了
async
和await
方法如何返回和捕获上下文
- My描述了该类型的相关部分,以及如何在整个.NET框架中使用它
- My有一个与异步兼容的“主循环”,包括和
关键在于,当异步
方法在等待中产生时,它实际上会返回给它的调用者。因此,从主循环的角度来看,该方法已经完成
稍后,当等待操作完成时,它将async
方法的其余部分调度到捕获的上下文中。在您提到的案例中(ASP.NET/WPF/WinRT),上下文是一个SynchronizationContext
。在UI框架(WPF/WinRT/WinForms/etc)中,SynchronizationContext
绑定到消息队列
因此,如果您想要一个与异步
兼容的“主循环”,则需要实现一个自定义的同步上下文
,该上下文允许将代理调度回该主循环
有关更多信息:
- My描述了
async
和await
方法如何返回和捕获上下文
- My描述了该类型的相关部分,以及如何在整个.NET框架中使用它
- My有一个与异步兼容的“主循环”,包括和
您是在问WPF/etc UI线程是如何做到这一点的,还是在特定的线程上自己会如何做到这一点?我确信框架的实际实现对我来说有点过分,我只是想知道它的要点。我不想自己实现它,但出于好奇,我想知道如果我想的话,我会怎么做。你是在问WPF/etc UI线程是如何做到这一点的,还是你会自己在特定的线程上做到这一点?我肯定框架是正确的