Ho un metodo con la seguente struttura:composizione Task e gestione degli errori 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;
}
importanza:
- il compito restituito da
InitializeAsync
non è considerata completa fino secondTask decide così secondTask
funziona solo se ha esito positivo- errore.210 o
secondTask
fa sì che il compito generale di fallire
Quello che mi chiedo è se c'è un più pulito, più semplice modo per esprimere questo mentre ottenere la stessa funzionalità. Sto usando .NET 4.0, ma mi interessa sapere se 4.5 rende tutto questo più semplice.
in 4.5 si può fare questo con funzioni attendi/asincroni e provare/catturare semplicemente collegando le attività insieme all'interno di una funzione asincrona – Carsten
Ho avuto lo stesso problema di recente e ho proseguito lungo lo stesso percorso fino a quando ho trovato il post sul blog di Stephen Toub a cui la risposta di Gideon si collega. È molto più pulito e più ovviamente gestisce tutti i casi d'angolo rispetto al mio primo tentativo di soluzione. – shambulator