У меня есть метод со следующей структурой:
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;
}
Важно:
InitializeAsync
, не считается выполненной, пока secondTask не примет такое решение secondTask
запускается только в случае успешного выполнения firstTask
firstTask
или secondTask
приводит к сбою всей задачиЧто я делаю интересно, есть ли более чистый и простой способ выразить это, достигнув той же функциональности. Я использую .NET 4.0, но меня интересует, упрощает ли это 4.5.