小编Wei*_* Lu的帖子

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

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

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

.net c# appdomain

7
推荐指数
1
解决办法
2323
查看次数

标签 统计

.net ×1

appdomain ×1

c# ×1