97 votes

Une Tâche d'exception(s) n'ont pas été observés, soit par l'Attente de la Tâche ou de l'accès à sa propriété Exception. En conséquence, l'exception a été observée

Qu'est-ce que cela signifie et comment le résoudre?

Je suis à l'aide de tâches TPL.

Toute erreur

Une Tâche d'exception(s) n'ont pas été observés, soit par l'Attente de la Tâche ou de l'accès à sa propriété Exception. En conséquence, le non observées exception a été relancés par le finaliseur fil.

au Système.Le filetage.Les tâches.TaskExceptionHolder.Finalize()

mscorlib

155voto

Reed Copsey Points 315315

Si vous créez une Tâche, et vous ne jamais appeler task.Wait() ou d'essayer de récupérer le résultat d'un Task<T>, lorsque la tâche est recueilli par le garbage collector, il va déchirer vers le bas de votre application en cours de finalisation. Pour plus de détails, consultez MSDN page sur la gestion des exceptions dans le TPL.

La meilleure option ici est de "gérer" l'exception à la règle. Cela peut être fait par l'intermédiaire d'une poursuite - vous pouvez joindre une continuation de la tâche, et log/avaler/etc l'exception qui se produit. Cela fournit un moyen propre de journal de tâche exceptions, et peut être écrite comme une simple extension de la méthode, c'est à dire:

public static void LogExceptions(this Task task)
{
    task.ContinueWith( t =>
    {
         var aggException = t.Exception.Flatten();
         foreach(var exception in aggException.InnerExceptions)
             LogException(exception);
    }, 
    TaskContinuationOptions.OnlyOnFaulted);
}

Ci-dessus, vous pouvez éviter toute tâche de démolir l'application et à l'enregistrement, par l'intermédiaire de:

Task.Factory.StartNew( () => 
   { 
       // Do your work...
   }).LogExceptions();

Alternativement, vous pouvez vous abonner à la TaskScheduler.UnobservedTaskException et de les traiter.

41voto

Marc Gravell Points 482669

Bien sûr; il signifie un Task obtenu finalisé après avoir été laissé à la collecte des déchets, mais la tâche elle-même a échoué. Il y a deux correctifs:

  • gérer les tâches échouer directement (utiliser ContinueWith(...) pour vous abonner, et vérifiez .IsFaulted et .Exception sur le Task dans le paramètre)
  • gérer l' TaskScheduler.UnobservedTaskException événement et marquer observée (appelez - e.SetObserved() après l'enregistrement de l'erreur)

-16voto

Son:

public static void ThrowFirstExceptionIfHappens(this Task task)
{
    task.ContinueWith(t =>
    {
        var aggException = t.Exception.Flatten();
        foreach (var exception in aggException.InnerExceptions)
        {
            throw exception; // throw only first, search for solution
        }
    },
    TaskContinuationOptions.OnlyOnFaulted); // not valid for multi task continuations
}

public static Task CreateHandledTask(Action action) 
{
    Task tsk = Task.Factory.StartNew(action);
    tsk.ThrowFirstExceptionIfHappens();
    return tsk;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X