SynchronizationContext.Current 在不同的应用程序域上运行时为空

Posted

技术标签:

【中文标题】SynchronizationContext.Current 在不同的应用程序域上运行时为空【英文标题】:SynchronizationContext.Current is null when run on different app domains 【发布时间】:2013-12-11 14:07:39 【问题描述】:

我有一个 Web 应用程序在一台机器上运行,而服务在另一台机器上运行(即两者都在不同的应用程序域中)。我的服务层中有一个工作流服务,它从 SynchronizationContext.Current 获取同步上下文。我得到 SynchronizationContext.Current 始终为空。但是如果我在同一台机器(即相同的应用程序域)上运行我的应用程序和服务层,则 SynchronizationContext.Current 是 AspNetSynchronizationContext 并且它工作正常。有人可以帮我解决这个问题以运行不同的应用程序域。

【问题讨论】:

【参考方案1】:

我通过覆盖同步上下文解决了这个问题

if (syncContext == null)

   SynchronousSynchronizationContext sync = new SynchronousSynchronizationContext();
   syncContext = sync;


class SynchronousSynchronizationContext : SynchronizationContext

   public override void Post(SendOrPostCallback d, object state)
   
      this.Send(d, state);
   

【讨论】:

【参考方案2】:

同步上下文通常由某种框架创建,例如 ASP.NET、WPF、WinForms 等。听起来当您在自己的进程中运行服务时,您并没有使用任何框架这会做到这一点。

还值得一提的是,SynchronizationContext.Current 通常只返回当前线程的同步上下文,所以如果你从错误的线程调用它,它几乎肯定会返回 null。

如果您没有可用的同步上下文,您可以随时创建自己的。本文解释了如何:

Synchronization Contexts in WCF

【讨论】:

以上是关于SynchronizationContext.Current 在不同的应用程序域上运行时为空的主要内容,如果未能解决你的问题,请参考以下文章