TPLで例外を処理する方法について多くのことを読んだことがありますが、実際にはわかりません。Tplで例外を処理する
このコード例みましょう:私はこれが
Catch 1
Continuation
を印刷することが期待しかし、私はこれは例外がまだ時に未処理とみなされることを意味し
Catch 1
Continuation
Wait Exception
を取得
var task1 = new Task(() => { throw new Exception("Throw 1"); });
var task2 = task1.ContinueWith(t => Console.WriteLine("Catch 1:{0}", t.Exception.Message),
TaskContinuationOptions.OnlyOnFaulted);
var task3 = task2.ContinueWith(t => Console.WriteLine("Continuation"));
task1.Start();
try {
task1.Wait();
}
catch (Exception ex) {
Console.WriteLine("Wait Exception: {0}", ex.Message);
}
をタスクが完了し、タスクファイナライザが最終的にアプリケーションを破棄します。
ファイナライザがスローしないように、継続内の例外をどのように処理しますか?同時に、私はタスクをフォールト状態にして、try/catchでタスクをラップすることはできません。
背景は私が指定したhereとしてではなく、エラー処理と非同期イベントパターンを実装するということです。私の完全なコードは、あなたが失敗したタスクのあなたの待機を行う。この
public IAsyncResult Begin(AsyncCallback callback, object state, Action action) {
var task1 = new Task(action);
var task2 = task1.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
if (callback != null) {
var task3 = task2.ContinueWith(t => callback(t),
TaskScheduler.FromCurrentSynchronizationContext());
var task4 = task3.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
}
task1.Start();
return task;
}
私は、継続の試行で 't.Wait()'を呼び出し、例外を無視することを考えました。しかし、それはうまくいかないでしょう。なぜなら、他の 'Wait()'スローの後に継続が実行されるからです。 – svick