AppDomain.Unload()如何中止线程?

Wei*_* Lu 7 .net c# appdomain

根据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在两个地方都有效.

我想知道这种差异应该发生吗?非常感谢

DiV*_*Van 1

当您卸载 userDomain 时,当前在该域中工作的线程会收到 AbortException。然而,同一个线程也“在”另一个AppDomain(主)中。将 AppDomain 作为数据分隔符,但不作为执行分隔符,CLR 无法中止正在生成多个 AppDomain 的线程。这就是为什么你只会得到 UnloadedException。

当您调用 Thread.Abort 时 - 您显式中止了线程的执行,无论它当前所在的 AppDomain 是什么。

不管怎样,当您只想卸载一些 AppDomain 时,您不希望线程被中止。