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

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

【问题讨论】:

    标签: asp.net asp.net-mvc-4 appdomain


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        • 2013-01-08
        • 2014-07-21
        相关资源
        最近更新 更多