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]
}