Mam metodę o następującej strukturze:skład Task i obsługi błędów z OC
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;
}
ważne:
- zadanie zwrócony przez
InitializeAsync
nie uważa się za zakończoną, aż secondTask postanawia więc secondTask
działa tylko po pomyślnym wykonaniufirstTask
- niepowodzeniem albo
firstTask
lubsecondTask
powoduje awarię całego zadania
Zastanawiam się, czy istnieje czystszy i prostszy sposób wyrażenia tego przy jednoczesnym osiągnięciu tej samej funkcjonalności. Korzystam z .NET 4.0, ale jestem zainteresowany tym, czy 4.5 też to ułatwia.
w wersji 4.5 możesz to zrobić z funkcjami oczekującymi/asynchronicznymi i próbować/złapać, po prostu podkręcając zadania wewnątrz funkcji async – Carsten
Miałem ten sam problem ostatnio i udałem się w dół tą samą trasą aż znalazłem wpis na blogu autorstwa Stephena Uderz, że odpowiedź Gideona jest połączona. Jest o wiele czystszy i lepiej obsługuje wszystkie przypadki narożne niż moja pierwsza próba rozwiązania. – shambulator