2012-03-28 15 views
8

.NET Task Parallel Libraryのエラー処理に関する質問があります。どちらのケースでは、AggregateExceptionは1つ以上の内部例外を保持しますか?私はこれが元に起こるかもしれないことを知っている。 Task.WaitAll(anArrayOfTasks)を呼び出すと2つ以上のタスクが例外をスローしていますが、それ以外の場合があります(つまり、1つのタスクが完了するのを待っているだけで1つ以上の内部例外が発生する可能性があります)。AggregateExceptionにはいつ複数の内部例外が含まれますか?

+0

パラレルライブラリとは関係ありません。ファイルのリストを削除する方法があるとしますが、ロックされているものがあるとします。 'AggregateException'を使ってロックされたファイルを再スローし、残りのファイルを削除し続けることができます。 – nalply

答えて

4

タスクは本質的に複数の内部例外を含むことができる集合例外を発生させることができます。つまり、タスクを処理する際には、複数の内部例外を含む集約例外を常に考慮する必要があります。 Task.WaitAllを使用していなくても、あなたが待っているタスクは内部的に複数のサブタスクを待つかもしれません。また、待機しているタスクが複数の例外を返す場合があります。あなたは単に発信者として知ることはできません。

+0

一般的なケースでは、例外のリストを取得し、そのようなエラー処理を設計すると仮定して、他の非同期タスクに依存しない単一の非同期タスクを処理する場合2つ以上の例外がパスされている状況。 – scripni

+0

おそらく、そうかもしれません。それはあまり起こりそうもない。内部のタスクが複数の子タスクを待つ場合。複数の(おそらく集合!)内部例外を含む1つのAggregateExceptionを含む新しいAggregateExceptionが作成されます。したがって、すべての例外を取得してコレクションとして処理するためには、AggregateExceptionでFlattenメソッドを呼び出すことを常にお勧めします。 – Polity

+0

この場合、どのようにエラーをUIに渡しますか?通常、操作を実行する場合、成功またはエラーの2つの結果があります。暗黙的にエラーリストを処理するUIを設計することは私の意見では混乱しているように見えますが、2つのケース(1つはエラー用、もう1つは複数エラー)は複雑すぎるようです。私はUIで常に1つの例外を処理し、すべての例外をログに記録することを考えていました(そして、エラーログを調べるためにメッセージをユーザに提示します)。 – scripni

5

これは、「親」タスクと1つ以上の「子」タスクが親に接続されている場合に発生します。つまり、親タスクはすべての子タスクが終了し、子タスクからの例外も親タスクに伝播した場合にのみ終了します。

テイク、例えば、次のコード:

var task = Task.Factory.StartNew(
    () => 
    { 
     Task.Factory.StartNew(
      () => { throw new Exception("inner"); }, 
      TaskCreationOptions.AttachedToParent); 

     throw new Exception("outer"); 
    }); 

あなたそのタスクにWait()が、それはAggregateExceptionをthowsた場合、それは次のようになります。

  • AggregateException
    • Exception:外側
    • AggregateException
      • Exception:インナー

あなたはそれがAggregateExceptionの内部AggregateException秒を含めることができることを好きではない場合、あなたはthe Flatten() methodを使用することができます。 AggregateExceptionの処理に使用できる別の方法もあります。Handle()

+0

Handle()メソッドについて言及してくれてありがとうございます。私はそのことについて知らなかったのです。 – scripni

関連する問題