以下是SynchronizationContext.CreateCopy
的典型实现:
public class CustomSynchronizationContext : SynchronizationContext
{
// ...
public override SynchronizationContext CreateCopy()
{
return this;
}
}
关于此方法的 MSDN 文档很少。我的问题是:
- 它在什么情况下被框架调用?
- 何时实现实际的复制逻辑,而不是仅仅返回对 源实例?
最佳答案
它由 ExecutionContext.Capture() 调用。一个相当重要的方法,它设置 Thread.ExecutionContext 属性。并且用于确保启动的线程将使用与启动工作线程的原始线程相同的同步提供程序。它确保由 Post 或 Send 编码的调用返回到正确的线程。
是否需要副本取决于原始同步提供程序结束其生命周期时您期望发生的情况。当然不需要 SynchronizationContext 的副本,它的 Post/Send 方法实际上根本不做任何有用的编码(marshal)处理,Post 只是在线程池线程上运行目标,Send 只是立即执行目标。因此,只需返回this 就足够了。
它对真正的提供者很重要,例如 WindowsFormsSynchronizationContext(使用 Control.Begin/Invoke 编码)或 DispatcherSynchronizationContext(使用 Dispatcher.Begin/Invoke 编码)。当 Winforms 或 WPF 应用程序的 UI 线程结束并且工作线程仍在执行并进行调用时,您需要获得良好的诊断。这需要保留对原始 Control 或 Dispatcher 的引用,以便它可以抛出正常的异常,如 InvalidOperationException 或 ObjectDisposedException。副本添加引用。
关于c# - SynchronizationContext.CreateCopy 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21062440/