Как AppDomain.Unload () прерывает потоки?

Согласно множественным ресурсам ( например, MSDN и CLR через C #), когда мы вызываем AppDomain.Unload (userDomain), потоки в userDomain будут вынуждены генерировать исключение ThreadAbortException, которое нельзя остановить, пока мы не вызовем Thread.ResetAbort. Итак, я попробовал приведенный ниже код, чтобы подтвердить свое недооценку. Один поток, созданный в домене по умолчанию, запускает приведенный ниже код для вызова объекта foo из 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");
     }

Код 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");
    }
  }
}

ЕСЛИ я попытался выгрузить userDomain, я был удивлен, что ThreadAbortException было обнаружено только в FooType: Run () (который находится в userDomain), но не в методе ThreadRun () (который находится в defaultDomain). И ThreadRun () получает только исключение AdException AppDomainUnlo, а затем продолжает работу.

Если я попытался напрямую прервать поток, не выгружая домен, исключение ThreadAbortException было обнаружено в обоих местах.

Интересно, должна ли эта разница возникать? Большое спасибо

7
задан Jason Kleban 8 January 2014 в 16:52
поделиться