首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SynchronizationContext.CreateCopy的目的

SynchronizationContext.CreateCopy的目的
EN

Stack Overflow用户
提问于 2014-01-11 12:52:12
回答 1查看 591关注 0票数 8

以下是SynchronizationContext.CreateCopy的典型实现

代码语言:javascript
复制
public class CustomSynchronizationContext : SynchronizationContext
{
   // ...

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

有关此方法的MSDN文档很少。我的问题是:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 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。副本添加引用。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21062440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档