2011-10-19 68 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

相关问题