我有一个应用程序需要在多个AppDomains之间发送大量的消息。我知道可以使用远程处理来实现这一点,但我也注意到了跨域委托。是否有人研究过这种问题?
我有一个应用程序需要在多个AppDomains之间发送大量的消息。我知道可以使用远程处理来实现这一点,但我也注意到了跨域委托。是否有人研究过这种问题?
我在使用命名管道绑定的情况下取得了良好的成功。 使用命名管道不会产生网络流量,采用二进制编码,因此应该相当快,而且不会牺牲将来扩展场景中的分发能力。
编辑: 更详细的信息,请参考此处,其中包括一个实现示例的链接。
远程调用是唯一的选择,无论您将其称为WCF还是其他任何东西,传递可序列化类型或使用MBRO类型(MarshalByRefObjects)。它不像你想的那么难。
- Oisin
我刚刚发现,你也可以使用AppDomain.SetData,但这只是一种方法,从主域到子域。
static void RunInChildDomain()
{
AppDomain childDomain = AppDomain.CreateDomain("friendlyName");
string parameterValue = "notmii";
childDomain.SetData("parameter", parameterValue);
childDomain.DoCallBack(PrintName);
}
static void PrintName()
{
string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter"));
Console.WriteLine(Name);
}
你还可以使用AppDomain.FirstChanceException事件在子应用域和主应用域之间创建基于异常的通信 :)
childDomain.SetData("domain", AppDomain.CurrentDomain);
然后在子域中执行GetData("domain")
以进行另一次Set/GetData和DoCallBack操作。 - NyunoCallContext 可以在 AppDomains 之间传递数据:
CallContext.LogicalSetData("Key", "My value");
Console.WriteLine("{0} from {1}", CallContext.LogicalGetData("Key"),
AppDomain.CurrentDomain.FriendlyName);
var appDomain = AppDomain.CreateDomain("Worker");
appDomain.DoCallBack(() => Console.WriteLine("{0} from {1}",
CallContext.LogicalGetData("Key"),
AppDomain.CurrentDomain.FriendlyName));
AppDomain.Unload(appDomain);
CallContext.FreeNamedDataSlot("Key");
这只是一个快速的想法,但我听说即使是跨域通信,从.NET 3.0开始,WCF也是推荐的方法。实际上,这很有道理,因为远程调用只是由WCF包装的另一种技术。