2009-10-19 9 views
3

Cet extrait de code est-il mal conçu? A l'origine, il n'y avait qu'un seul AppDomain.Unload, dans le bloc finally. Cela a eu l'effet indésirable que d'autres threads pouvaient continuer à fonctionner dans AppDomain pendant que UnhandledException fonctionnait, ce qui, entre autres, utilise l'entrée utilisateur et est donc très lent sur une échelle de calcul (l'exécution réelle moyenne peut être> 1min). et causant généralement plus de problèmes. Je suis bloqué en pensant à un «meilleur» moyen de le faire, donc, je soumets cela à SO. Donne moi tes esprits.Comment dois-je gérer avec élégance les AppDomains défectueux?

Remarque: Je viens de réaliser qu'il y a aussi des problèmes de synchronisation. Oui, je sais ce qu'ils sont, restons concentrés.

mainApp = AppDomain.CreateDomain(ChildAppDomain, null, AppDomain.CurrentDomain.SetupInformation); 
try 
{ 
    mainApp.ExecuteAssembly(Assembly.GetEntryAssembly().Location); 
    finished = true; 
} 
catch (Exception ex) 
{ 
    AppDomain.Unload(mainApp); 
    mainApp = null; 
    UnhandledException(this, new UnhandledExceptionEventArgs(ex, false)); 
} 
finally 
{ 
    if (mainApp != null) 
    { 
     AppDomain.Unload(mainApp); 
     mainApp = null; 
    } 
} 

// ... 

void UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    if (mainApp != null) 
    { 
     AppDomain.Unload(mainApp); 
     mainApp = null; 
    } 
    // [snip] 
} 

Répondre

2

Je ne ferais pas de duplication. Et imo vous pourriez faire ce travail avec seulement nettoyer l'appdomain dans votre bloc finalement, comme vous l'avez fait initialement. L'idée étant que si une exception non gérée se produit, placez-la dans une variable et traitez-la après avoir fermé le domaine d'application.

Exception unhandledException = null; 
try 
{ 
    ... 
} 
catch (Exception ex) 
{ 
    unhandledException = ex; 
} 
finally 
{ 
    CleanupAppDomain(mainApp); 
} 

if (unhandledException != null) 
    UnhandledException(this, new UnhandledExceptionEventArgs(unhandledException, false)); 
Questions connexes