【问题标题】: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