1

この MSDN の例に従って、以下のコードを使用しようとしています。ただし、e.ErrorRunWorkerCompleted では、SomeMethod() でエラーが発生した場合でも常に null です。

private void WorkerDoWork(object sender, DoWorkEventArgs e)
{
   getMethod = SomeMethod();
}

private void Worker_RunWorkerCompleted(object sender,
                                             RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        var result = ModernDialog.ShowMessage("Error occurred.... " +
                                   e.Result, "ErrorTitle", MessageBoxButton.OK);
    }
    else if (e.Cancelled)
    {

    }
    Else
    {

    }
}

誰かが私が間違っていることを見ることができますか?

次のようにして回避できますが、MSDN の例がうまくいかない理由がよくわかりません。

private void WorkerDoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        getMethod = SomeMethod();
    }
    catch(Exception ex)
    {
        e.Result = ex;
    }
}

private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

    if (e.Result is Exception)
    {
            var result = ModernDialog.ShowMessage("Error occurred.... " + e.Result, "ErrorTitle", MessageBoxButton.OK);
    }

    //etc
}

また、2 番目の方法を使用すると、e.Result から .Message にアクセスできません。たとえば、WorkerDoWork で使用できますex.Message

編集:独自のエラーを作成するようにワーカーをセットアップしましたが、それでもe.Error == nullが発生します。表示される変数は、CTRL+PrtSc でフェードするため、少しかすんでいます。 ここに画像の説明を入力

4

1 に答える 1

3

問題は、空の例外ブロックにあると思いますemailWorkerDoWork()。結果が例外になるためには、バックグラウンド ワーカーで例外をキャッチできません。

したがって、次のようなもので目的の結果が得られるはずです。

private void emailWorkerDoWork(object sender, DoWorkEventArgs e)
{
    int value = 1 / int.Parse("0");
}

私の疑いを確認し、MSFT リファレンスを提供する別の SO 回答を見つけまし

于 2013-11-08T21:46:25.667 に答える