Je veux la Tâche de gérer toutes les exceptions qui sont levées, mais je trouve qu'il est difficile pour les empêcher d'atteindre le parent

Je suis en train de travailler sur un Web Crochet.NET 4.0 qui exécute un lambda de manière asynchrone et puis d'afficher le résultat d'une URI quand c'est fini.

J'ai qu'à travailler, mais maintenant je veux la Tâche de gérer toutes les exceptions qui sont levées, et je suis de trouver qu'il est difficile pour les empêcher d'atteindre le parent.

Voici la partie de mon code:

private readonly Func<T> _startTask;
private readonly string _responseUri;

public Task<T> Begin()
{
    var task = new Task<T>(_startTask);
    task.ContinueWith<T>(End);
    task.Start();
    return task;
}

private T End(Task<T> task)
{
    if (task.IsFaulted)
    {
        return HandleException(task);
    }

    var result = task.Result;
    WebHookResponse.Respond(result, _responseUri);
    return result;
}

private T HandleException(Task<T> task)
{
    WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
    return null;
}

Une autre version que j'ai essayé appels ContinueWith() deux fois pour enregistrer une poursuite pour exécuter OnlyOnRanToCompletion et une autre OnlyOnFaulted. (Je ne suis pas sûr si l'appel de ContinueWith() deux fois, c'est correct.):

public Task<T> Begin()
{
    var task = new Task<T>(_startTask);
    task.ContinueWith<T>(End, TaskContinuationOptions.OnlyOnRanToCompletion);
    task.ContinueWith<T>(HandleException, TaskContinuationOptions.OnlyOnFaulted);
    task.Start();
    return task;
}

private T End(Task<T> task)
{
    var result = task.Result;
    WebHookResponse.Respond(result, _responseUri);
    return result;
}

private T HandleException(Task<T> task)
{
    WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
    return null;
}

Donc, fondamentalement, je veux un moyen pour chaque Tâche de gérer ses propres exceptions via une fonction de prolongement. Comme il est le HandlException la continuation de la fonction n'est jamais appelée, dans les exemples ci-dessus.

Je suis causant des exceptions dans des cas de test, et je dois préciser que je suis en utilisant un Tasks.WaitAll(tasks); appel sur un tableau de Tâches pour s'assurer que toutes les tâches sont terminées avant de faire mes affirmations, et je ne suis pas sûr si cet appel fait une différence à la façon dont les exceptions sont gérées par les Tâches. Actuellement WaitAll jette un AggregationException qui regroupe les exceptions pour chacune des Tâches parce qu'ils ne sont pas gérés par le HandleException fonction de prolongement.

Je ne vois pas le problème. Quel comportement avez-vous observé?
Désolé, le HandleException la continuation de la fonction n'est pas appelée. Un AggregationException est jeté par les Tâches.WaitAll(tâches); appel. Je ne veux pas voir un AggregationException. Je viens de mettre à jour la question.
Owen Bonjour, mon HandleExceptionContinuation n'est pas d'être appelé trop et ma UnobservedTaskException événement n'est pas déclenché trop ici : stackoverflow.com/questions/11831844/... avez-vous trouvé une solution ?
Aussi méfiez-vous d'un risque de fuite de mémoire si vous utilisez des poursuites qui ne sont pas d'exécution en combinaison avec un jeton d'annulation.

OriginalL'auteur Martin Owen | 2010-07-19