Составление задач и обработка ошибок с помощью 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;
}

Важно:

  • задача, возвращаемая InitializeAsync, не считается выполненной, пока secondTask не примет такое решение
  • secondTask запускается только в случае успешного выполнения firstTask
  • сбой firstTask или secondTask приводит к сбою всей задачи

Что я делаю интересно, есть ли более чистый и простой способ выразить это, достигнув той же функциональности. Я использую .NET 4.0, но меня интересует, упрощает ли это 4.5.

7
задан Charles 6 March 2012 в 16:44
поделиться