我有一種情況,我需要創建一個(可以說是髒的)浸泡測試運行器。這個想法是使用類似於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在新域中運行,但問題在於爲什麼。
我很高興指出一些就寢時間的閱讀方法,這是如何工作的,我過去的一天,我想我不應該使用正確的術語。
任何幫助,非常感謝。
感謝, 馬丁
你先生,真棒。 – Martin