アニが言ったように、これらは例外を観察するために継続を使用しAggregateExceptions
て複数の連続した s を介して作成できます。Task
Task t1 = Task.Factory.StartNew(() => { throw new Exception(); });
Task t2 = Task.Factory.StartNew(() => { throw new Exception(); });
Task t3 = Task.WhenAll(t1, t2)
.ContinueWith(t => t.Exception.InnerExceptions.Count(),
TaskContinuationOptions.OnlyOnFaulted);
通常AggregateException
、継続内で処理します。Task
継続は、継続元タスクの例外プロパティによって、継続元によって例外がスローされたかどうかを確認できます。以下は、a の結果をNullReferenceException
コンソールに出力します。
Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write(ant.Exception());
task1
が例外をスローし、この例外が継続によってキャプチャ/クエリされない場合、処理されていないと見なされ、アプリケーションが終了します。Status
継続では、キーワードを介してタスクの結果を確立するだけで十分です
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.Flatten().Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
上記では、単一の例外のみを想定しています。これが確実に呼び出されるようにするためFlatten()
です。他のタイプの例外が予想される場合はInnerException
、必要に応じて s を反復処理できます。
これが役立つことを願っています。