Gestion des exceptions BackgroundWorker
Je suis en train de travailler avec les composants suivants:
- une Bibliothèque (qui déclenche une exception)
- un test de la console pour tester mon journalisation
- de la bibliothèque d'entreprise gestion des exceptions blocs d'application
- de la bibliothèque d'entreprise application d'enregistrement de blocs
Je suis en invoquant la méthode de bibliothèque à l'aide d'un backgroundworker. La bibliothèque lance l'exception mais la RunWorkerCompleted gestionnaire n'est jamais appelée.
La seule façon d'attraper l'exception est d'entourer mon DoWork gestionnaire de code avec un bloc try/catch.
N'est méconnaître la RunWorkerCompletedEventArgs.Erreur De Propriété? N'est-il pas pour obtenir des exceptions, qui a été pris par le BackgroundWorker?
Codesample:
static BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(w_DoWork);
w.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(w_RunWorkerCompleted);
w.RunWorkerAsync();
static void w_DoWork(object sender, DoWorkEventArgs e)
{
MyClass m = new MyClass();
w.result = m.Compute();
}
static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
HandleException(e.Error);
}
/* result related code */
}
static void HandleException(Exception e)
{
ExceptionPolicy.HandleException(e, "MyPolicy");
}
L'exemple ci-dessus entraînera la résiliation de mon application console. Le vs2010 sortie écrit absolument rien (seulement sortie par défaut).
Alors où est le problème?
//Edit: cet extrait fonctionne pour la capture de la bibliothèque de l'exception.
static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{
MyClass m = new MyClass();
w.result = m.Compute();
}catch(Exception e){ }
}
source d'informationauteur csteinmueller
Vous devez vous connecter pour publier un commentaire.
C'est le bon modèle pour BackgroundWorker.
Je soupçonne que le problème, c'est que votre
Main
méthode est sortie avant le BW est terminé.RunWorkerAsync
retourne immédiatement et si vous n'êtes pas en attente dansMain
ensuite, votre processus de fin, peut-être même avant le BW a commencé, jamais l'esprit rempli.Essayez d'ajouter un
Console.ReadLine
à la fin de votreMain
méthode.D'intérêt:
BW se comporte différemment dans une application Console et d'une application Windows. Si vous utilisez un WinForms ou WPF application, il y aura un dérivé SynchronizationContext sur votre thread d'INTERFACE utilisateur et de BW va maréchal
RunWorkerCompleted
retour vers le thread d'INTERFACE utilisateur et de l'exécuter. C'est l'un des principaux avantages de la BW.Dans une Application Console, la valeur par défaut SynchronizationContext est utilisé et ce commissaires
RunWorkerCompleted
sur un thread du pool. Cela signifie que vous pouvez bloquer leMain
fil et le gestionnaire terminé sera toujours exécuté.