2016-08-22 16 views
1

ContinueWithを使用したTaskで問題が発生しました。コールバックでは、最初のタスクにフォールトが発生したときに私はExceptionを観察/処理しませんでした。私はここで、この場合に何が起こるかを発見:
Proper way to use .ContinueWith for Tasksデフォルトでタスクを待っているのは誰ですか?

独自の継続が 例外を守らない場合、 完全にこのワークフロー全体に待っている人が行っている、ということを覚えておいてくださいそれを観察する者になる。
待望されていないTaskのウェイターです:私の不思議作ら


デフォルトでTaskを待っているのは誰ですか?例えば

:この場合

public int HowOldAmI() 
{ 
    Task t = Task.Run(async() => { 
      await Task.Delay(5000); 
      throw new Exception("Something happened"); 
    }); 
    return 42; 
} 

、はTaskを待っている

+3

何もあなたが示されてきた場合には、ありません。タスクが完了するのを「暗黙的に」待つものはありません。タスクを作成し、それを待たない場合、例外は観察されない例外ハンドラに送られます。 –

+0

ありがとう@JonSkeet。 _unobserved例外ハンドラ_はどこかに文書化されていますか?私が求めているのは、実際のクラッシュは起こっていないのに、クラッシュレポートライブラリがこれらの例外をキャッチしていることです。そのため、クラッシュレポートに表示されないように例外を正しく処理しようとしています。 –

+1

Andrewからの回答を参照してください。 –

答えて

2

何も待たれていないタスクは待っていません。このため、それらを待つことが重要です。そうしないと、すべての例外が飲み込まれ、プログラムに論理的なエラーがあることがわかりません。以前のバージョンの.NETでは、ロジックが異なり、観察できない例外が発生した場合にプロセスがクラッシュしました。

観察されない例外(たとえば、どこかで少なくともログに記録するなど)に役立つイベントもあります:TaskScheduler.UnobservedTaskException

も、この問題の議論を参照してください:Unobserved Task exceptions in .NET 4.5 still crash app

+0

ありがとうございます。したがって、私が最初の 'タスクt'を' t.ContinueWith((previousTask)=> {/ *例外を観察しないコード* /})で続けても、_UnobservedTaskException_ハンドラが呼び出されます。 –

+1

はい、正確です。タスクの 'Result'または' Exception'プロパティにアクセスするか、例外が 'obser'になるのを待つ必要があります。それ以外の場合は、そのイベントに渡されます。 –

関連する問題