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

これを行う直接的な方法はないようです。OnlyOnRanToCompletionNoneに変更し、継続に渡される各タスクのExceptionが null でないかどうかを確認することで、これを回避しました。何かのようなもの

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 に答える