J'ai une méthode avec la structure suivante:composition des tâches et la gestion des erreurs avec TPL
public Task InitializeAsync()
{
var taskCompletionSource = new TaskCompletionSource<bool>();
Task firstTask = ...;
// secondTask calls taskCompletionSource.TrySetResult(true) once it considers itself "done"
Task secondTask = firstTask.ContinueWith(..., TaskContinuationOptions.OnlyOnRanToCompletion);
Action<TasK> errorContinuation = x =>
{
taskCompletionSource.SetException(e.Exception);
};
firstTask.ContinueWith(errorContinuation, TaskContinuationOptions.OnlyOnFaulted);
secondTask.ContinueWith(errorContinuation, TaskContinuationOptions.OnlyOnFaulted);
return taskCompletionSource.Task;
}
important:
- la tâche renvoyée par
InitializeAsync
n'est pas considérée comme complète jusqu'à ce que le secondTask décide secondTask
fonctionne seulement sifirstTask
est réussie- échec de l'un ou l'autre
firstTask
ousecondTask
provoque la tâche globale à l'échec
Ce que je me demande est de savoir s'il y a un produit de nettoyage, de façon plus simple d'exprimer, tout en obtenant les mêmes fonctionnalités. J'utilise .NET 4.0, mais je suis intéressé de savoir si 4.5 rend aussi cela plus facile.
en 4.5 vous pouvez le faire avec les fonctions wait/async et essayer/attraper en branchant simplement les tâches ensemble dans une fonction asynchrone – Carsten
J'ai eu le même problème récemment et suis allé sur le même chemin jusqu'à ce que je trouve le blog Toub que la réponse de Gideon est liée. C'est beaucoup plus propre et gère plus évidemment tous les cas d'angle que ma première tentative de solution. – shambulator