C# SynchronizationContext选择的线程中的哪个状态不在IAsyncStateMachine中?

C# SynchronizationContext选择的线程中的哪个状态不在IAsyncStateMachine中?,c#,.net,multithreading,async-await,task-parallel-library,C#,.net,Multithreading,Async Await,Task Parallel Library,在异步方法中发生等待时,IAsyncStateMachine会保留“局部变量”和其他必要的状态。据我所知,这包括方法变量和该方法正在使用的静态/实例变量 当wait发生时,它还捕获一个SynchronizationContext,该上下文确定方法重新进入(继续)的时间、地点(在哪个线程上)以及顺序。此上下文选择重新进入的线程将包括继续可能使用的其他状态 因此,并非所有的“必要状态”都进入状态机;其中一些在SynchronizationContext为继续选择的线程中 问题: 线程包含状态机不包含

异步
方法中发生
等待
时,
IAsyncStateMachine
会保留“局部变量”和其他必要的状态。据我所知,这包括方法变量和该方法正在使用的静态/实例变量

wait
发生时,它还捕获一个
SynchronizationContext
,该上下文确定方法重新进入(继续)的时间、地点(在哪个线程上)以及顺序。此上下文选择重新进入的线程将包括继续可能使用的其他状态

因此,并非所有的“必要状态”都进入状态机;其中一些在
SynchronizationContext
为继续选择的线程中

问题:

  • 线程包含状态机不包含的状态是什么
  • 与进入状态机的状态相比,进入线程的状态有哪些特征

    当异步方法中发生等待时,IAsyncStateMachine保留“局部”和其他必要的状态。据我所知,这包括方法变量和该方法正在使用的静态/实例变量

    状态机确实需要跟踪局部变量(包括方法的参数)。它不跟踪任何实例变量或静态变量。在方法结束后,不需要将它们放在状态机中,它们才能存在;方法结束后,它们将继续完全独立存在

    当等待发生时,它还捕获一个SynchronizationContext,它确定何时、何地(在哪个线程上)以及方法重新进入(继续)的顺序

    虽然出于偶然提及的目的,这通常与事实非常接近,因此许多人倾向于这样说,但这并不完全正确,其微妙之处与这个特定问题相关

    SynchronizationContext
    只是一个类,它有一个
    Post
    Send
    方法,在这个方法中,上下文被提供了一个方法,它在任何“上下文”对这种情况意味着什么的情况下都会执行该方法。它可以按照自己的意愿执行该委托,不同的上下文可以通过多种方式决定如何执行该委托

    对于windows窗体或WPF应用程序使用的同步上下文,这意味着在UI线程的消息循环中运行它。对于ASP应用程序,这意味着调度一个线程池线程以运行特定的请求集
    HttpContext
    (同时确保没有两个线程同时运行,即使同一个线程不能用于处理请求的所有操作)。您还可以编写自己的同步上下文,以执行您希望它执行的任何操作

    此上下文选择用于重新进入的线程包含该方法正在使用的状态

    通常不会。线程特定的状态主要是堆栈上的数据,它主要由方法参数和局部变量组成,但在
    async
    方法的情况下,局部变量和方法参数都被提升到状态机的字段中。虽然从技术上讲,同步上下文设置线程静态字段是可能的(事实上,这是在ASP中使用
    HttpContext.Current
    )的情况下发生的),但这是非常不寻常的。这种情况下涉及的任何特定于线程的状态只能是同步上下文中的代码,而不是
    async
    关键字固有的任何内容

    线程包含状态机不包含的状态是什么


    async
    方法的一般情况下,无。任何通常存储在线程特定位置的数据都会被移动到状态机,从而不再是线程特定的

    与进入状态机的状态相比,进入线程的状态有哪些特征

    如果它是特定于该线程的,那么所有这些都将进入状态机

    当异步方法中发生等待时,IAsyncStateMachine保留“局部”和其他必要的状态。据我所知,这包括方法变量和该方法正在使用的静态/实例变量

    状态机确实需要跟踪局部变量(包括方法的参数)。它不跟踪任何实例变量或静态变量。在方法结束后,不需要将它们放在状态机中,它们才能存在;方法结束后,它们将继续完全独立存在

    当等待发生时,它还捕获一个SynchronizationContext,它确定何时、何地(在哪个线程上)以及方法重新进入(继续)的顺序

    虽然出于偶然提及的目的,这通常与事实非常接近,因此许多人倾向于这样说,但这并不完全正确,其微妙之处与这个特定问题相关

    SynchronizationContext
    只是一个类,它有一个
    Post
    Send
    方法,在这个方法中,上下文被提供了一个方法,它在任何“上下文”对这种情况意味着什么的情况下都会执行该方法。它可以按照自己的意愿执行该委托,不同的上下文可以通过多种方式决定如何执行该委托

    对于windows窗体或WPF应用程序使用的同步上下文,这意味着在UI线程的消息循环中运行它。对于ASP应用程序,这意味着调度线程池线程以使用特定的请求集
    HttpContext
    运行(同时确保没有两个线程同时运行,即使可能不使用同一个线程)