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

C# AppDomain.Unload()如何中止线程?,c#,.net,appdomain,C#,.net,Appdomain,根据多个资源(例如,通过C#调用MSDN和CLR),当我们调用AppDomain.Unload(userDomain)时,userDomain中的线程将被迫抛出ThreadAbortException,在调用Thread.ResetAbort之前无法停止。所以我试着用下面的代码来证明我的理解。在默认域中创建的一个线程运行以下代码来调用在另一个域(即用户域)中创建的FooType的eFoo对象 下面列出了Foo.Run代码(它只执行睡眠操作) 如果我尝试卸载userDomain,我会惊讶地发现Th

根据多个资源(例如,通过C#调用MSDN和CLR),当我们调用AppDomain.Unload(userDomain)时,userDomain中的线程将被迫抛出ThreadAbortException,在调用Thread.ResetAbort之前无法停止。所以我试着用下面的代码来证明我的理解。在默认域中创建的一个线程运行以下代码来调用在另一个域(即用户域)中创建的FooType的eFoo对象

下面列出了Foo.Run代码(它只执行睡眠操作)

如果我尝试卸载userDomain,我会惊讶地发现ThreadAbortException仅在FooType:Run()中(位于userDomain中)捕获,而在ThreadRun()方法中(位于defaultDomain中)未捕获。ThreadRun()只获取AppDomainUnlo adException,然后继续运行

如果我试图在不卸载域的情况下直接中止线程,那么ThreadAbortException在这两个地方都是可行的


我想知道这种差异是否会发生?非常感谢

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

当您调用Thread.Abort时-您正在显式中止线程的执行,该线程当前位于AppDomain中


无论如何,当您只想卸载一些AppDomain时,您不会希望线程被中止。

可能当您中止
userDomain
时,
defaultDomain
可能会收到一个包装异常(内部异常为
ThreadAbortException
。请尝试使用
catch(异常示例)
相反,检查是否引发了不同的异常以及它是什么
InnerException
。我想在这种情况下会引发
AppDomainUnloadexception
    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");
     }
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");
    }
  }
}