2011-07-13 33 views
4

我有一個小問題,讓我整晚都保持清醒。也許這很容易理解,但我還不能。C#AppDomains和Threads

哪個更好?線程內的AppDomain或新AppDomain內的線程?

所以至極是性差異之間:

static void Main() { 
    AppDomain ad = AppDomain.CreateDomain ("NewDomain"); 
    Thread t = new Thread (delegate() { ad.DoCallBack (SomeMethod); }); 
    t.Start(); 
} 

static void SomeMethod() { } 

和:

public void Start() { 
    myAssembly = Assembly.LoadFrom(dllFileName); 
    Type myType = AssEnsamblado.GetType(myAseembly.Type); 
    MethodInfo myMethod = tipo.GetMethod(@"StartDLL"); 
    object obj = Activator.CreateInstance(myType); 
    Thread thrBase = new Thread(new ThreadStart(delegate() { myMethod.Invoke(obj, null); })); 
    thrBase.Start(); 
} 

以上在類女巫正在執行的代碼段從MBRO繼承,創建遠程實例,並調用方法包含該代碼。

謝謝先進。

+4

動機是什麼?你想達到什麼目的? –

+0

嗨!主要目標是通過WCF進程在兩個應用程序域之間進行通信。這已經完成了,但我還沒有找到關閉客戶端的好方法,而不是中止線程。所以我一直在研究,也許最好是有一個遠程類來控制和執行方法,或者控制擁有新的appdomain的線程。也許這種做法是錯誤的。所以,我一直在研究。感謝您的關注。 – BlackCath

回答

0

我會冒險,並說,一旦你的代碼在新的應用程序域中執行,它幾乎沒有任何區別。

問題是與其他應用程序域的交叉,其中可能要求需要序列化/編組對象(如果它支持的話)傳遞/返回到新的應用程序域。

+0

嗨!我已經封送了對象,我需要它調用初始化客戶端的方法。然而,我仍然想知道這可能是最好的方式,爲了關閉客戶端。感謝您的關注。 – BlackCath

0

避開此類代碼(任何一個樣本)。它會讓你的生活變得糟糕,除非你喜歡在這裏和那裏調試奇怪的例外。

面對問題 - 優雅地關閉遠程工作。通常有很多方法可以做到這一點,包括取消或終止它的不同方式,但調用一個骯髒的黑客Thread.Abort()只是邪惡的。

+0

嗨!我同意,放棄不是最好的方式,軟件和人類。我已經通過一個事件關閉了客戶端,並且正在創建和打開頻道。讓我們看看這是否有效。感謝您的關注。 – BlackCath

+0

@BlackCath可能會檢查Task類,它支持取消或者可能會在另一個問題中發佈您的客戶端 - 服務器代碼,並查看人們認爲是實現該目的的最佳方式。 – oleksii