SynchronizationContext.CreateCopy 的目的
Posted
技术标签:
【中文标题】SynchronizationContext.CreateCopy 的目的【英文标题】:The purpose of SynchronizationContext.CreateCopy 【发布时间】:2014-01-30 11:54:12 【问题描述】:以下是SynchronizationContext.CreateCopy
的典型实现:
public class CustomSynchronizationContext : SynchronizationContext
// ...
public override SynchronizationContext CreateCopy()
return this;
MSDN 文档很少介绍这种方法。我的问题是:
-
框架在什么情况下调用它?
何时实现实际的复制逻辑,而不是仅仅返回对
源实例?
【问题讨论】:
【参考方案1】:它被 ExecutionContext.Capture() 调用。一个相当重要的方法,它设置了 Thread.ExecutionContext 属性。并且用于确保启动的线程将使用与启动工作线程的原始线程相同的同步提供程序。它确保由 Post 或 Send 编组的调用返回到正确的线程。
您是否需要副本取决于您期望在原始同步提供程序结束其生命周期时发生什么。当然不需要 SynchronizationContext 的副本,它的 Post/Send 方法实际上根本不做任何有用的封送处理,Post 只是在线程池线程上运行目标,Send 只是立即执行目标。所以只返回 this 就足够了。
这对真正的提供程序很重要,例如 WindowsFormsSynchronizationContext(使用 Control.Begin/Invoke 编组)或 DispatcherSynchronizationContext(使用 Dispatcher.Begin/Invoke 编组)。当 Winforms 或 WPF 应用程序的 UI 线程结束并且工作线程仍在执行并进行调用调用时,您需要获得良好的诊断。这需要保留对原始 Control 或 Dispatcher 的引用,以便它可以抛出一个像样的异常,如 InvalidOperationException 或 ObjectDisposedException。副本添加引用。
【讨论】:
以上是关于SynchronizationContext.CreateCopy 的目的的主要内容,如果未能解决你的问题,请参考以下文章