Можно ли продолжить выполнение задачи C после выполнения A и B до завершения без ошибки или отмены, используя один метод TPL? - PullRequest
7 голосов
/ 08 декабря 2010

Я пытался использовать Task.Factory.ContinueWhenAll () несколько раз сейчас с намерением вызвать продолжение только тогда, когда все предшествующие версии завершаются без каких-либо ошибок или отмен.Это приводит к генерации ArgumentOutOfRangeException с сообщением,

Недопустимо исключать определенные типы продолжений для продолжений из нескольких задач.Имя параметра: continueationOptions

Например, код

var first = Task.Factory.StartNew<MyResult>(
    DoSomething,
    firstInfo,
    tokenSource.Token);
var second = Task.Factory.StartNew<MyResult>(
    DoSomethingElse,
    mystate,
    tokenSource.Token);
var third = Task.Factory.ContinueWhenAll(
    new[] { first, second },
    DoSomethingNowThatFirstAndSecondAreDone,
    tokenSource.Token,
    TaskContinuationOptions.OnlyOnRanToCompletion, // not allowed!
    TaskScheduler.FromCurrentSynchronizationContext());

недопустим для TPL.Есть ли способ сделать что-то подобное, используя другой метод TPL?

1 Ответ

4 голосов
/ 03 марта 2011

Кажется, нет прямого способа сделать это.Я справился с этим, изменив OnlyOnRanToCompletion на Нет и проверив, является ли Exception ненулевым для каждой задачи, переданной в продолжение.Что-то вроде

private void DoSomethingNowThatFirstAndSecondAreDone(Task<MyResult>[] requestTasks)
{
    if (requestTasks.Any(t => t.Exception != null))
        return;

    // otherwise proceed...
}

работает, но это, кажется, не очень удачный способ обработки случая с несколькими антецедентами и разрывы с шаблоном в одном случае Task.Factory.ContinueWith использует.

...