を明示的にチェックTask.Exception
しているため、これは機能し、例外が監視されないようにします。
ここでいくつかの推奨事項を示します。
まず、これが本当に長時間実行されるタスクである場合は、次のように指定することをお勧めします。
var task = Task.Factory.StartNew(() => {
// long running process
throw new Exception("test"); // throwing TestException
}, TaskCreationOptions.LongRunning);
第二に、次のクロージャーは必要ありませんtask
。
// use x.Exception, since x is the task
task.ContinueWith(x => MyErrorHandler(x.Exception), TaskContinuationOptions.OnlyOnFaulted);
これをメイン スレッドで実行することもできます。特に、(UI で) より複雑なレポートを使用することにした場合は、次のようにします。
// This will work if MyErrorHandler uses a UI control, since it'll marshal back to the current synchronization context
task.ContinueWith(x => MyErrorHandler(x.Exception),
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
(これは、エラー ハンドラで UI コントロールなどを使用する場合にのみ必要です。)
また、.NET 4.5 または .NET 4 用の async ターゲット設定パックを使用している場合は、new async
/ await
support を使用してこれを簡素化できます。メソッドに としてフラグを立てるとasync
、次のことができます。
try
{
await Task.Factory.StartNew(() => {
// long running process
throw new Exception("test"); // throwing TestException
}, TaskCreationOptions.LongRunning);
}
catch(Exception error)
{
MyErrorHandler(error);
}