0

私は次のように Threadpool.QueueUserWorkItem を使用しています

public void TestMain()
    {
        try
        {
            ThreadPool.QueueUserWorkItem(x =>
                {
                    this.Dispatcher.BeginInvoke(new Action(() => this.BackGroundMethod()));
                }
            );
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

    private void BackGroundMethod()
    {
        try
        {
            int a = 0;
            int b = 100;
            var error = b / a;
        }
        catch(Exception)
        {
            throw;
        }
    }

このように、TestMain() は例外をキャッチできません。プログラムはシャットダウンします...

このエラーをキャッチするにはどうすればよいですか?

どうも。

4

6 に答える 6

1

次のようなメソッドDispatcher.UnhandledExceptionで例外をキャッチするには、イベントを使用します。TestMain()

Dispatcher.UnhandledException += (sender, args) => MessageBox.Show(args.Exception.Message);
ThreadPool.QueueUserWorkItem(ignore => Dispatcher.Invoke(new Action(BackGroundMethod)));

Handled編集:内部例外ハンドラーが呼び出されないようにプロパティを設定することを忘れないでください:

Dispatcher.UnhandledException += (sender, args) => 
{
    MessageBox.Show(args.Exception.Message);
    args.Handled = true;
}
于 2012-10-24T08:53:41.193 に答える
1

その理由は非同期で実行されるため、実行される前にthis.Dispatcher.BeginInvoke(new Action(() => this.BackGroundMethod));内部のすべてのコードの実行が終了します。TestMainBackGroundMethod

于 2012-10-24T08:46:52.687 に答える
0

AppDomain.UnhandledExceptionを処理することにより、アプリケーション内のすべてのスレッドですべての例外をキャッチできます。

于 2012-10-24T08:48:02.423 に答える
0

クラッシュを防ぐには、スローされる可能性のある操作の前後にtry/を追加します。catch

ThreadPool.QueueUserWorkItem(x =>
{
    try {
        this.Dispatcher.BeginInvoke(new Action(() => this.BackGroundMethod()));
    }
    catch (DivideByZeroException ex) {
        // handle the error somehow
    }
});

ただし、ここで何をしているのか考えてみてください。あるアクションをスレッド プールにプッシュし、次に同じアクションをディスパッチャ スレッドにプッシュしています。電話をかけずに自分で直接やってみませんQueueUserWorkItemか?

于 2012-10-24T08:49:55.427 に答える
0

Dispatcher を使用して新しいスレッドを作成すると、そのスレッドには独自のスタックがあるため、例外は try...catch inTestMainにバブルしませんが、代わりにBackgroundMethodメソッドで発生します。try キャッチで例外BackgroundMethodをスローしているため、役に立たないため、BackgroundMethodプログラムで例外をスローしないとシャットダウンしません。

private void BackGroundMethod()
{
    try
    {
        int a = 0;
        int b = 100;
        var error = b / a;
    }
    catch(Exception)
    {
        MessageBox.Show(ex.Message);
    }
}
于 2012-10-24T08:40:28.367 に答える