簡體   English   中英

如何在AppDomains之間進行最佳通信?

[英]How best to communicate between AppDomains?

我有一個應用程序需要在許多AppDomain之間發送適量的消息。 我知道我可以使用遠程處理實現這一點,但我也注意到有跨域委托。 誰有人看過這種問題?

我使用帶有命名管道綁定的WCF取得了很好的成功。 使用命名管道不會創建網絡流量並使用二進制編碼,因此它應該非常快,而不會犧牲在未來擴展方案中分發的能力。

編輯:請參閱此處以獲取更多詳細信息,包括實施示例的鏈接。

跨域委托僅允許具有零參數的void方法,並且它可能不是您認為的那樣。 它只是一個簡單的回調用於從一個appdomain到另一個appdomain的通知目的,例如像InitComplete()之類的方法。

Remoting是唯一的選擇,無論你是將它稱為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事件在子域和主機應用程序域之間創建異常驅動的通信:)

這只是一個快速思考,但我聽說即使是跨域通信, WCF也是推薦的方法,當然從.NET 3.0開始。 實際上這是有道理的,因為遠程處理只是WCF包含的另一項技術。

我想擴展xOn的答案。 他建議使用WCF或MarshalByRefObject,但考慮到問題是關於AppDomains之間的通信,而不是關於進程之間的通信,我認為MBRO方法實現起來非常簡單,因此是正確的答案。

當我自己研究這個問題時,我一開始就努力了解子AppDomain如何與父進行通信,直到我意識到你可以將一個句柄傳遞給一個MBRO對象進入子進程,然后孩子可以解開該句柄到與父(或任何其他AppDomain)通信。 我在這里發布了一個解決方案。

我后來了解到,您可以定義一個接口,在復雜的類上實現該接口,然后只將句柄傳遞給接口。 這可以大大減少加載子AppDomain可能需要的程序集數量。

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");

該代碼使用System.Runtime.Remoting.Messaging。 我個人沒有衡量這個解決方案的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM