2015-08-17 2 views
0

J'essaie de comprendre comment utiliser AppDomains.Pourquoi ce code qui s'exécute sur AppDomain séparé plante mon processus?

Le besoin:

J'ai une application web unique processus qui charge dynamiquement dll et appelle à l'aide de la réflexion. Je veux m'assurer qu'un crash dans une DLL chargée ne plante pas le processus, en plus de créer une séparation entre le code "externe" et mon code de base.

J'ai donc cette classe « isloated »:

public sealed class Isolated<T> : IDisposable where T : MarshalByRefObject 
{ 
    private AppDomain _domain; 
    private T _value; 

    public Isolated() 
    { 
     _domain = AppDomain.CreateDomain("Isolated:" + Guid.NewGuid(), 
      null, AppDomain.CurrentDomain.SetupInformation); 

     Type type = typeof(T); 

     _value = (T)_domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); 
    } 

    public T Value 
    { 
     get 
     { 
      return _value; 
     } 
    } 

    public void Dispose() 
    { 
     if (_domain != null) 
     { 
      AppDomain.Unload(_domain); 

      _domain = null; 
     } 
    } 
} 

et moi avons écrit le code ci-dessous, mon espérance ne serait pas écraser le processus, mais il le fait.

public class Work : MarshalByRefObject 
{ 
    public void DoSomething() 
    { 
     Thread thread = new Thread(new ThreadStart(() => 
     { 
      throw new Exception(); 
     })); 

     thread.IsBackground = true; 

     thread.Start(); 

     while (true) 
     { 
      System.Diagnostics.Trace.WriteLine("Hello from main thread"); 
     } 
    } 
} 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     using (Isolated<Work> isolated = new Isolated<Work>()) 
     { 
      isolated.Value.DoSomething(); 
     } 
    } 

Pouvez-vous s'il vous plaît m'aider à comprendre ce que je fais mal?

+1

Votre code producesses une exception non gérée qui va tuer votre application quelle que soit la appdomain il est jeté. – Jehof

+0

Mais l'un des objectifs de AppDomain n'est-il pas de traiter un tel scénario? Par exemple, si j'utilise une version bêta de plug-in tiers, j'importe dans une application d'environnement de production? –

+0

Aussi, s'il vous plaît se référer à ce poste qui le mentionne dans le commentaire des réponses: http://stackoverflow.com/questions/1094478/what-is-a-net-application-domain –

Répondre