我带来了一个让我彻夜难眠的小问题。也许这很容易理解,但我还不能。
哪个更好?线程内的 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 的类中执行,以创建远程实例并调用包含该代码的方法。
我会冒险说,一旦你的代码在新的应用程序域中执行,无论哪种方式都没有什么区别。
问题是跨越到其他应用程序域,这可能需要对传递/返回到新应用程序域的对象进行序列化/编组(如果支持)。
远离此类代码(任一示例)。这会让你的生活变得一团糟,除非你喜欢花几周的时间到处调试奇怪的异常。
面对root问题 - 优雅地关闭远程作业。通常有很多方法可以做到这一点,包括取消或终止它的不同方法,但调用肮脏的黑客
Thread.Abort()
只是邪恶的。