c# - SynchronizationContext.CreateCopy 的目的

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

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

public class CustomSynchronizationContext : SynchronizationContext
{
   // ...

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

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

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

最佳答案

它由 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/

相关文章:

.net - 何时使用异步模式处理 wcf 对象

c# - Windows 安全自定义登录验证

c# - 从 json 字符串中提取信息并将其添加到 C# 中的列表

multithreading - 消息传递任意对象图?

c# - 如何修复 ToggleButton 悬停检测?

c# - 无法从 Asp.Net WebApi 操作方法连接到网站 URL

c# - Windows 服务框架?

c# - .Net Core cookie不会被设置

python - 在线程中捕获中断的系统调用

java - 我可以在它死后重新启动一个线程吗?