7

我现在尝试使用Task.Factory.ContinueWhenAll()几次,目的是仅在所有先行项运行完成且没有任何错误或取消时才调用延续。这样做会导致ArgumentOutOfRangeException与消息一起抛出,

排除多个任务的延续的特定延续类型是无效的。参数名称:continuationOptions

例如,代码

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 方法来做这样的事情?

4

1 回答 1

4

似乎没有直接的方法可以做到这一点。我通过将OnlyOnRanToCompletion更改为None并检查传递给延续的每个任务的Exception是否非空来解决这个问题。就像是

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

    // otherwise proceed...
}

有效,但这似乎不是一种非常令人满意的方式来处理具有多个前因的案例并打破单案例Task.Factory.ContinueWith使用的模式。

于 2011-03-03T16:05:26.077 回答