SynchronizationContext.CreateCopy的目的

nos*_*tio 8 .net c# multithreading synchronization task-parallel-library

以下是典型的实现SynchronizationContext.CreateCopy:

public class CustomSynchronizationContext : SynchronizationContext
{
   // ...

   public override SynchronizationContext CreateCopy()
   {
      return this;
   }
}
Run Code Online (Sandbox Code Playgroud)

关于这种方法的MSDN文档很少.我的问题是:

  1. 在什么情况下框架会调用它?
  2. 何时实现实际的复制逻辑,而不仅仅是返回对源实例的引用?

Han*_*ant 9

它由ExecutionContext.Capture()调用.它是一个相当重要的方法,它设置了Thread.ExecutionContext属性.并用于确保启动的线程将使用与启动工作线程的原始线程相同的同步提供程序.它确保由Post或Send封送的调用返回到正确的线程.

是否需要副本取决于您希望在原始同步提供程序结束其生命周期时发生的情况.当然不需要SynchronizationContext的副本,它的Post/Send方法实际上根本没有做任何有用的编组,Post只是在线程池线程上运行目标,Send只是立即执行目标.所以返回这个就足够了.

它在真正的提供程序上很重要,例如WindowsFormsSynchronizationContext(带有Control.Begin/Invoke的编组)或DispatcherSynchronizationContext(带有Dispatcher.Begin/Invoke的编组).当Winforms或WPF应用程序的UI线程结束并且工作线程仍在执行并进行调用调用时,您需要获得良好的诊断.这需要保留对原始Control或Dispatcher的引用,以便它可以抛出一个体面的异常,如InvalidOperationException或ObjectDisposedException.副本添加引用.