tengo un método con la siguiente estructura:composición de tareas y gestión de errores con 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;
}
Es importante destacar que:
- la tarea devuelto por
InitializeAsync
no se considera completa hasta que el secondTask así lo decide secondTask
solo se ejecuta sifirstTask
es correcto- error de
firstTask
osecondTask
hace que la tarea general falle
Lo que me pregunto es si hay una más limpia, más simple manera de expresar esto mientras que el logro de la misma funcionalidad. Estoy usando .NET 4.0 pero estoy interesado en si 4.5 también lo hace más fácil.
en 4.5 usted puede hacer esto con funciones de espera/asincrónicas y probar/atrapar simplemente juntándose las tareas dentro de una función asíncrona – Carsten
Tuve el mismo problema recientemente y seguí la misma ruta hasta que encontré la publicación del blog de Stephen Toub que la respuesta de Gideon se relaciona con. Es mucho más limpio y, obviamente, maneja todos los casos de esquina que mi intento inicial de solución. – shambulator