根据muliple资源(例如,通过C#的MSDN和CLR),当我们调用AppDomain.Unload(userDomain)时,userDomain中的线程将被强制抛出ThreadAbortException,这不能是sttile untile我们调用Thread.ResetAbort.所以我尝试了以下代码来证明我的不足.在默认域中创建的一个线程运行以下代码来调用在另一个域(即用户域)中创建的FooType的fooType对象
void ThreadRun(object o)
{
try
{
// this call will cross the App domain;
foo.Run();
}
catch (AppDomainUnloadedException EXP)
{
Console.WriteLine("Get appdomain unload exception");
}
catch (ThreadAbortException EXP)
{
Console.WriteLine("Get threadAbortException in ThreadRun");
}
Console.WriteLine("Strange, this thread is still alive");
}
Run Code Online (Sandbox Code Playgroud)
下面列出了Foo.Run代码(除了睡眠之外什么都不做)
public class FooType : MarshalByRefObject {
public void Run()
{
try
{
Console.WriteLine("Foo.Run is running at " + Thread.GetDomain().FriendlyName);
Thread.Sleep(TimeSpan.FromSeconds(1500));
}
catch (ThreadAbortException)
{
Console.WriteLine("get thread abort exception");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试卸载userDomain,我很惊讶ThreadAbortException仅在FooType:Run()(在userDomain中)中捕获,而不是在ThreadRun()方法(在defaultDomain中)中捕获.而ThreadRun()只获取AppDomainUnlo adException,然后继续运行.
如果我试图在不卸载域的情况下直接中止线程,则ThreadAbortException在两个地方都有效.
我想知道这种差异应该发生吗?非常感谢
当您卸载 userDomain 时,当前在该域中工作的线程会收到 AbortException。然而,同一个线程也“在”另一个AppDomain(主)中。将 AppDomain 作为数据分隔符,但不作为执行分隔符,CLR 无法中止正在生成多个 AppDomain 的线程。这就是为什么你只会得到 UnloadedException。
当您调用 Thread.Abort 时 - 您显式中止了线程的执行,无论它当前所在的 AppDomain 是什么。
不管怎样,当您只想卸载一些 AppDomain 时,您不希望线程被中止。