5

私はBackgroundWorkerを持つWPFアプリケーションを持っています。私はこのBGWに例外をスローしますが、どこにも表示されません!、バックグラウンドワーカーだけがWorkerFinishedイベントを発生させます。私の例外はwpfアプリケーションで何の違いも生じていないのはなぜですか?

どこへ行くのですか?

+1

にthrownedで例外:「操作はあなたのコードが処理されない例外が発生した場合は、BackgroundWorkerのは、例外をキャッチしにそれを渡します。 RunWorkerCompletedイベントハンドラは、System.ComponentModel.RunWorkerCompletedEventArgsのErrorプロパティとして公開されています。 – dlev

+1

WPFとは関係ありません。 http://www.albahari.com/threading/を読んでください。時間がかかるでしょう! – Yahya

答えて

7

各スレッドには独自の呼び出しスタックがあります。例外は独自の呼び出しスタックを上に移動するだけで、別のスレッドの呼び出しスタックに "流出"することはできません。

例外ハンドラがDoWorkイベントハンドラを起動するBackgroundWorkerのコードにバブルすると、例外が明示的にキャッチされ、Errorプロパティに格納され、コールスタックの先頭に到達してアプリケーションをクラッシュさせることになります。

BGWが例外をスローした場合にプログラムを終了したい場合は、完了したイベントを処理し、例外をチェックしてから再スローしたり、新しい例外をスローする必要があります。

+1

バックグラウンドスレッドの例外もアプリケーションをクラッシュさせます。この場合、BackgroundWorkerクラスは、例外がスローされた場合にアプリケーションをクラッシュさせないように設計されています。 – skjagini

+0

@SujithJaginiそうです。編集されました。 – Servy

4

ここに、いい例があります。 BackgroundWorker` `上のMSDNのエントリからRunWorkercompleted

Unhandled exceptions in BackgroundWorker

var worker = new BackgroundWorker(); 
worker.DoWork += (sender, e) => 
    { 
     throw new InvalidOperationException("oh shiznit!"); 
    }; 
worker.RunWorkerCompleted += (sender, e) => 
    { 
     if(e.Error != null) 
     { 
      MessageBox.Show("There was an error! " + e.Error.ToString()); 
     } 
    }; 
worker.RunWorkerAsync(); 
関連する問題