2010-10-17 6 views
0

Je reçois une exception étrange sur la création de tâches dans .net 4.0.gérer les exceptions sur les tâches sur .net 4.0

Je reçois l'exception sur les fenêtres service avec un mondial Updomain gestionnaire d'exceptions non gérées, donc je n'ai pas la pile exacte: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property.

Je pense qu'il se produit sur la section de code suivant:

for (int i = 0; i < _workers.Length; ++i) 
     { 
      int j = i; // copy 

      Task t1 = Task.Factory.StartNew(() => 
      { 
       try 
       { 
        if (!_workers[j].Join(4000)) 
         LogWriter.Trace("Failed to join thread", "ThreadFailureOnDispose"); 
       } 
       catch (Exception ex) 
       { 
        OnLogged(ex.Message + ex.StackTrace); 
       } 
      }); 

     } 

Quelqu'un a une idée? Est-ce quelque chose avec la fonction d'exception agrégée?

+0

Voici quelques informations à ce sujet: http://social.msdn.microsoft.com/Forums/en-US/rx/thread/ee5dba5d-eea9-4d85-8f58-c2e1c71ef33a –

+0

Corrigez d'abord votre gestionnaire d'événement UnhandledException . Les tâches _workers sont-elles également? –

+0

no. _workers sont des threads. que voulez-vous dire réparer mon gestionnaire d'événement UnhandledException? pour une raison quelconque, le service Windows s'arrête, même si l'exécution est interceptée et enregistrée dans AppDomain.CurrentDomain.UnhandledException. – user437631

Répondre

0

bien, je pense que la tâche devrait prendre AggregateExecption lors de l'utilisation Parallel.For \ Foreach comme suit:

try 
     { 
      Parallel.For(0, _workers.Length, i => 
      { 

       DoWork(i); 

      }); 

     } 
     catch (AggregateException ex) 
     { 
      // Assume we know what's going on with this particular exception. 
      // Rethrow anything else. AggregateException.Handle provides 
      // another way to express this. See later example. 
      foreach (var e in ex.InnerExceptions) 
      { 
       OnLogged(e.Message + e.StackTrace); 
      } 

     } 
0

Vous devriez trouver l'exception est de type AggregateException (pour référence ultérieure comprennent le type d'exception en posant des questions — il est des informations clés).

Ceci inclut les exceptions levées dans sa propriété InnerExceptions.

+0

comment dois-je le faire? des exemples? – user437631

+0

@ user437631 Pour le débogage, regardez la sortie, identifiez les erreurs et corrigez-les. Dans les cas de poignée d'exécution, vous pouvez gérer l'exécution à l'intérieur de la tâche ou un jeu de Continuation pour les exceptions. C'est à dire. comme pour toute exception. – Richard

Questions connexes