2011-07-04 3 views
37

AggregateException原因:しかし私はREPROとしていくつかの簡単なコードを持っている

var taskTest = Task.Factory.StartNew(() => 
{ 
    System.Threading.Thread.Sleep(5000); 

}).ContinueWith((Task t) => 
{ 
    Console.WriteLine("ERR"); 
}, TaskContinuationOptions.OnlyOnFaulted); 

try 
{ 
    Task.WaitAll(taskTest); 
} 
catch (AggregateException ex) 
{ 
    foreach (var e in ex.InnerExceptions) 
     Console.WriteLine(e.Message + Environment.NewLine + e.StackTrace); 
} 

を、私は、try catchブロックにスローされる予期しないTaskCanceledExceptionを取得しています(それがでますAggregateException InnerExceptionsオブジェクト)。 "タスクがキャンセルされました"。

なぜこの例外が発生しますか?タスクの継続は発生しません。例外は発生しませんでしたが、まだ待機中に集計例外が発生します。

私はこのことがどういう意味なのか説明できますか?

+0

私はあなたとまったく同じシナリオを持っていました。私は以前の仕事の結果を代わりに伝えることがよりエレガントで直感的だったと思います。 TaskCanceledExceptionをスローするとかなり驚きました... – NickL

答えて

53

あなたは仕事を待っていませんとOnlyOnFaulted継続 - あなたはにその続行(ContinueWithによって返されます)を待っています。元のタスクが正常に返されたため、続行は決して実行されないため、キャンセルされたかのように動作します。

私には意味があります。

私はあなたのタスクを作成する疑いがある、継続を追加したが、その後タスクを待つ:

var taskTest = Task.Factory.StartNew(() => 
{ 
    System.Threading.Thread.Sleep(5000); 

}); 
taskTest.ContinueWith((Task t) => 
{ 
    Console.WriteLine("ERR"); 
}, TaskContinuationOptions.OnlyOnFaulted); 
+4

Ahh良い呼び出し...私はContinueWithが元のタスクを返していたと思っていました... – Redth

+0

この説明では大きな説明、ただ1つのコメントはおそらくFactory.StartNew継続が定義される前にタスクを開始できるので、()メソッドを使用します。ここでは、新しいTask()ctorを使用し、次にContinueWith()を設定し、最後にStart()メソッドを呼び出します。それは理にかなっていますか? –

+1

@JorgeFioranelli:継続が定義される前にタスクを開始するのがなぜ問題になるのですか? TPLはこれを問題なく処理します。 –

関連する問題