如何在AppDomains之间进行最佳通信?

ope*_*lar 38 .net c# remoting appdomain

我有一个应用程序需要在许多AppDomain之间发送适量的消息.我知道我可以使用远程处理实现这一点,但我也注意到有跨域委托.谁有人看过这种问题?

Mic*_*ows 26

我使用带有命名管道绑定的WCF取得了很好的成功.使用命名管道不会创建网络流量并使用二进制编码,因此它应该非常快,而不会牺牲在未来扩展方案中分发的能力.

编辑:请参阅此处以获取更多详细信息,包括实施示例的链接.


x0n*_*x0n 12

跨域委托仅允许具有零参数的void方法,并且它可能不是您认为的那样.它只是一个简单的回调用于从一个appdomain到另一个appdomain的通知目的,例如像InitComplete()之类的方法.

Remoting是唯一的选择,无论你是将它称为WCF还是其他任何东西,传递可序列化类型,或使用MBRO类型(MarshalByRefObjects).它并不像你想象的那么难.

-Oisin

  • @Guillaume 是的,我同意 - 我可能应该更清楚地区别,但那是四年前了:D (2认同)

not*_*mii 10

我刚刚发现您也可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用AppDomain.FirstChanceException事件在子域和主机应用程序域之间创建异常驱动的通信:)


Vad*_* S. 5

CallContext 允许在 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");
Run Code Online (Sandbox Code Playgroud)

该代码使用 System.Runtime.Remoting.Messaging。我个人没有衡量这个解决方案的性能。