次のコードを取得したとしましょう。
var tasks = BuildTaskList();
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException exception)
{
}
でどのタスクがどの例外をスローしたかを知るにはどうすればよいexception.InnerExceptions
ですか?
次のコードを取得したとしましょう。
var tasks = BuildTaskList();
try
{
Task.WaitAll(tasks.ToArray());
}
catch (AggregateException exception)
{
}
でどのタスクがどの例外をスローしたかを知るにはどうすればよいexception.InnerExceptions
ですか?
のリストがまだあり、Tasks
それぞれTask
にException
プロパティがあります。それを使用して、どの例外がどの に属しているかを把握できますTask
。
ただし、可能であれば、ブロッキング待機を使用するTask.WhenAll
か、実行するよりも良いでしょう。TaskFactory.ContinueWhenAll
var throwers = tasks.Where(task => task.Exception != null);
var t1 = Task.Factory.StartNew(() => Console.WriteLine("Task 1"));
var t2 = Task.Factory.StartNew(() => Console.WriteLine("Task 2"));
var t3 = Task.Factory.StartNew(() => { throw new InvalidOperationException(); });
var t4 = Task.Factory.StartNew(() => Console.WriteLine("Task 4"));
Task.Factory.ContinueWhenAll(new[] { t1, t2, t3, t4 }, tasks =>
{
foreach (var t in tasks)
{
if (t.Status == TaskStatus.Faulted)
{
// this will run for t3
Console.WriteLine("This task has been faulted.");
}
}
});