C#AppDomains和Threads

时间:2011-07-13 19:47:18

标签: c# multithreading marshalling appdomain

我带来了一个小问题让我彻夜难眠。也许它很容易理解,但我还不能。

哪个更好?线程内的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的类中执行,以创建一个远程实例并调用包含该代码的方法。

2 个答案:

答案 0 :(得分:0)

我会承担风险,并说一旦你的代码在一个新的应用程序域中执行,它在任何方面都没有什么差别。

问题是与其他应用程序域的交叉,可能需要对传递/返回到新应用程序域的对象(如果它支持它)进行序列化/编组。

答案 1 :(得分:0)

避开这些代码(任何一个样本)。它会让你的生活变得地狱,除非你喜欢在这里和那里花几周时间调试奇怪的异常。

面对 root 问题 - 正常关闭远程作业。通常有很多方法可以做到这一点,包括取消或终止它的不同方法,但是调用脏黑客Thread.Abort()只是邪恶的。