以下是SynchronizationContext.CreateCopy的典型实现
public class CustomSynchronizationContext : SynchronizationContext
{
// ...
public override SynchronizationContext CreateCopy()
{
return this;
}
}有关此方法的MSDN文档很少。我的问题是:
发布于 2014-01-11 14:01:54
它由ExecutionContext.Capture()调用。一个非常重要的方法,它设置Thread.ExecutionContext属性。并用于确保已启动的线程将使用与启动工作线程的原始线程相同的同步提供程序。它确保由Post或Send封送的调用返回到正确的线程。
是否需要副本取决于当原始同步提供程序结束其生命周期时所期望发生的事情。当然不需要SynchronizationContext的副本,它的Post/Send方法实际上根本不执行任何有用的封送处理,Post只是在线程池线程上运行目标,Send只是立即执行目标。所以只要把这个还回去就够了。
对于一个真正的提供者来说,这确实很重要,比如WindowsFormsSynchronizationContext(使用Control.Begin/Invoke的封送)或DispatcherSynchronizationContext (使用Dispatcher.Begin/Invoke的封送处理)。当Winforms或WPF应用程序的UI线程结束时,工作线程仍在执行和调用调用,那么您希望得到一个很好的诊断。这需要在原始控件或调度程序上保留一个引用,这样它就可以抛出一个像样的异常,比如InvalidOperationException或ObjectDisposedException。副本添加引用。
https://stackoverflow.com/questions/21062440
复制相似问题