SynchronizationContext.CreateCopy的目的

时间:2014-01-11 12:52:13

标签: c# .net multithreading synchronization task-parallel-library

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

public class CustomSynchronizationContext : SynchronizationContext
{
   // ...

   public override SynchronizationContext CreateCopy()
   {
      return this;
   }
}

MSDN文档很少涉及此方法。我的问题是:

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

1 个答案:

答案 0 :(得分: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。该副本添加了引用。