タスクでスローされた例外を処理済みとしてマークするにはどうすればよいですか。Wait()
問題は、タスクのメソッドを呼び出すと、かなり前にAggregateException
既に処理した場合でもスローされることです。AggregateException
次のコード スニペットは、解決したい問題を示しています。元のコードは、コードの一部で処理し、コードの別の部分でメソッドAggregateException
を呼び出します。Wait()
しかし、問題は同じです。
static void Main(string[] args)
{
Task task = null;
try
{
task = new Task(() =>
{
Console.WriteLine("Task started");
Thread.Sleep(1000);
throw new InvalidOperationException("my test exception");
});
task.ContinueWith(t =>
{
Console.WriteLine("Task faulted");
AggregateException ae = t.Exception;
ae.Flatten().Handle(ex =>
{
if (typeof(InvalidOperationException) == ex.GetType())
{
Console.WriteLine("InvalidOperationException handled --> " + ex.Message);
return true;
}
return false;
});
}, TaskContinuationOptions.OnlyOnFaulted);
task.Start();
Thread.Sleep(2000);
task.Wait();
}
catch (AggregateException ae)
{
Console.WriteLine("AggregateException thrown again!!! Why???");
ae.Flatten().Handle(ex =>
{
Console.WriteLine(ex.Message);
return true;
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Finished");
Console.Read();
}
上記のコードは、次の出力を生成します。
- タスク開始
- タスクが失敗しました
- InvalidOperationException の処理 --> 私のテスト例外
- AggregateException が再びスローされました!!! どうして???
- 私のテスト例外
- 終了した