C# 重用等待线程

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线程保

因此,众所周知,像asp.NET、WPF和WinRT这样的框架为您管理一个或多个线程。在asp.NET中,框架汇集了一组线程,这些线程从队列中获取请求并进行处理。在WPF中,框架为您管理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线程是如何做到这一点的,还是你会自己在特定的线程上做到这一点?我肯定框架是正确的