2011-10-19 65 views
2

我有一種情況,我需要創建一個(可以說是髒的)浸泡測試運行器。這個想法是使用類似於Tasks或ThreadPool的方法一次運行大量的測試。應用程序域切換

問題是,它將使用很多(由我發展很差的)輔助類,它們在其中使用靜態。這從來都不是一個問題,因爲一切都被拆除並在使用後重新啓動。這意味着當我在同一個應用程序域中啓動多個線程時,它們使用相同的靜態,並且事情變得麻煩。

注意:這是一個基於我一直在做的測試的假設,我不是100%確定這是問題。

我試圖創建一個新的AppDomain(AppDomain.Create),然後用它(domain.CreateInstanceFromAndUnwrap)創建一個類的實例,並創建實例,我可以調用它的方法。問題是它似乎沒有在新的AppDomain中運行。

下面的代碼我到目前爲止:

static void CallBack(BasePerfTest bpf) 
    { 
     Console.WriteLine("CurrentAppDomain (WithinCallback): {0}", Thread.GetDomain().Id); 
     AppDomain newdomain = AppDomain.CreateDomain(Guid.NewGuid().ToString()); 
     //newdomain.ExecuteAssembly(".\\PerformanceTestRunner.exe", new string[] { bpf.ToString() }); 
     ProcessRunner pr = (ProcessRunner)newdomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().Location, "PerformanceTesting.ProcessRunner"); 
     pr.RunProcess(bpf); 
    } 

} 
[Serializable] 
public class ProcessRunner 
{ 
    public void RunProcess(BasePerfTest bpf) 
    { 
     Console.WriteLine("CurrentAppDomain (WithinPR): {0}", Thread.GetDomain().Id); 
    } 

} 

現在,我會想到的是,RunProcess()方法是在域中執行,但DOMAINID仍然是相同的,因此它擊中問題靜力學碰撞。

現在,我確實創建了一個單獨的控制檯應用程序,並且註釋掉的行顯示了我用來運行它的代碼。此DID在新域中運行,但問題在於爲什麼。

我很高興指出一些就寢時間的閱讀方法,這是如何工作的,我過去的一天,我想我不應該使用正確的術語。

任何幫助,非常感謝。

感謝, 馬丁

回答

4

有兩種方式過度的AppDomain邊界公開對象:

  • Serializable - 對象序列化,所以你得到一個副本。
  • MarshalByRefObject - 使用遠程處理爲您的對象創建代理。

您需要後者爲您的ProcessRunner類。

MarshalByRefObject讓你的類繼承:

public class ProcessRunner : MarshalByRefbject 
{ 
    public void RunProcess(BasePerfTest bpf) 
    { 
     Console.WriteLine("CurrentAppDomain (WithinPR): {0}", Thread.GetDomain().Id); 
    } 
} 

當你在第二AppDomain中實例化你的類,你會得到一個代理。 MSDN上的MarshalByRefObject文檔中的示例也應該對您有所幫助 - 它幾乎可以確切顯示您正在嘗試執行的操作。

+0

你先生,真棒。 – Martin

2

您的ProcessRunner類必須從System.MarshalByRefObject繼承。發生的事情是該對象實際上是在輔助appdomain中創建的,但是當您將其分配給本地「pr」變量時,它將通過值將其歸還到您的主AppDomain,實際上在第二個AppDomain中創建ProcessRunner的第二個實例主要appdomain。如果從MarshalByRefObject繼承,那麼pr將取而代之的是一個透明的代理對象,它將調用轉發給駐留在輔助appdomain中的對象。

+0

對不起,你的答案是一樣的,但馬克得到了第一個。感謝幫助,雖然。 – Martin

相關問題