2011-06-23 9 views
6

Según varios recursos (por ejemplo, MSDN y CLR a través de C#), cuando llamemos a AppDomain.Unload (userDomain), los hilos en el userDomain se verán obligados a lanzar ThreadAbortException, que no pueden detenerse hasta que lo llamemos Thread.ResetAbort. Así que probé el código a continuación para atestiguar mi desaprobación. Un hilo, creado en el dominio predeterminado, se ejecuta el siguiente código para invokefoo objeto de FooType que se crea en otro dominio (es decir, dominio de usuario)¿Cómo aborta AppDomain.Unload() los hilos?

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

El código Foo.Run se enumeran a continuación (no hace nada, pero simplemente dormir)

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

si trataba de descargar la userdomain, me sorprende que el ThreadAbortException fue capturado sólo en FooType: Ejecutar() (que se encuentra en la userdomain), pero el método no en ThreadRun() (que está en el dominio predeterminado). Y ThreadRun() solo obtiene AppDomainUnlo adException y luego sigue ejecutándose.

Si traté de abortar directamente el hilo sin descargar el dominio, se recibieron ThreadAbortException en ambos lugares.

Me pregunto si se supone que esta diferencia sucederá? Muchas gracias

+0

Tal vez cuando cancela 'userDomain', el' defaultDomain' podría estar recibiendo una excepción envuelta (y la excepción interna es 'ThreadAbortException'. Intenta usar' catch (Exception ex) 'y examina si se lanza una excepción diferente y qué es 'InnerException'. Supongo que se lanzará una 'AppDomainUnloadedException' en ese caso. –

Respuesta

1

Al descargar userDomain, el hilo que está trabajando actualmente en ese dominio obtiene una AbortException. Sin embargo, el mismo hilo está "en" otro AppDomain también (principal). Al tener AppDomains como separadores de datos, pero no como separadores de ejecución, CLR no puede cancelar el hilo que está generando varios AppDomains. Esta es la razón por la que obtendrás solo UnloadedException.

Al llamar a Thread.Abort, está cancelando explícitamente la ejecución de un hilo, independientemente de AppDomain en el que se encuentra actualmente.

De todos modos, no querría que su hilo se anule cuando todo lo que quería hacer era descargar algún AppDomain.

Cuestiones relacionadas