私はBackgroundWorker
を持つWPFアプリケーションを持っています。私はこのBGWに例外をスローしますが、どこにも表示されません!、バックグラウンドワーカーだけがWorkerFinished
イベントを発生させます。私の例外はwpfアプリケーションで何の違いも生じていないのはなぜですか?
どこへ行くのですか?
私はBackgroundWorker
を持つWPFアプリケーションを持っています。私はこのBGWに例外をスローしますが、どこにも表示されません!、バックグラウンドワーカーだけがWorkerFinished
イベントを発生させます。私の例外はwpfアプリケーションで何の違いも生じていないのはなぜですか?
どこへ行くのですか?
各スレッドには独自の呼び出しスタックがあります。例外は独自の呼び出しスタックを上に移動するだけで、別のスレッドの呼び出しスタックに "流出"することはできません。
例外ハンドラがDoWork
イベントハンドラを起動するBackgroundWorkerのコードにバブルすると、例外が明示的にキャッチされ、Error
プロパティに格納され、コールスタックの先頭に到達してアプリケーションをクラッシュさせることになります。
BGWが例外をスローした場合にプログラムを終了したい場合は、完了したイベントを処理し、例外をチェックしてから再スローしたり、新しい例外をスローする必要があります。
ここに、いい例があります。 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();
にthrownedで例外:「操作はあなたのコードが処理されない例外が発生した場合は、BackgroundWorkerのは、例外をキャッチしにそれを渡します。 RunWorkerCompletedイベントハンドラは、System.ComponentModel.RunWorkerCompletedEventArgsのErrorプロパティとして公開されています。 – dlev
WPFとは関係ありません。 http://www.albahari.com/threading/を読んでください。時間がかかるでしょう! – Yahya