2010-12-07 3 views
7

私は、すべての前件がエラーや取り消しなしで完了まで実行されたときにのみ、継続を呼び出すために、Task.Factory.ContinueWhenAll()を数回使用しようとしました。そうすることで、複数のタスクのオフ継続のための具体的な継続の種類を除外するために無効であるAとBが1つのTPLメソッドを使用して障害やキャンセルなしで完了した後で、タスクCを続行できますか?

例外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

これを行う直接の方法はないようです。私はこれを変更することによってこの問題を解決しました。OnRanToCompletionなし例外があるかどうかを確認するには、続行に渡された各タスクについて、はnullではありません。

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

    // otherwise proceed... 
} 

作品のようなものが、これはTask.Factory.ContinueWith用途シングルケースパターンで複数の先行詞と休憩でケースを処理するために非常に満足のいく方法ではないようです。