我带来了一个小问题让我彻夜难眠。也许它很容易理解,但我还不能。
哪个更好?线程内的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的类中执行,以创建一个远程实例并调用包含该代码的方法。
答案 0 :(得分:0)
我会承担风险,并说一旦你的代码在一个新的应用程序域中执行,它在任何方面都没有什么差别。
问题是与其他应用程序域的交叉,可能需要对传递/返回到新应用程序域的对象(如果它支持它)进行序列化/编组。
答案 1 :(得分:0)
避开这些代码(任何一个样本)。它会让你的生活变得地狱,除非你喜欢在这里和那里花几周时间调试奇怪的异常。
面对 root 问题 - 正常关闭远程作业。通常有很多方法可以做到这一点,包括取消或终止它的不同方法,但是调用脏黑客Thread.Abort()
只是邪恶的。