7

アプリケーションの1つで、バックグラウンドワーカーに非常に奇妙な問題が発生しています。最近、いくつかのGUI修正を使用して少しオーバーホールしましたが、別のPCで誰か​​が.exeを実行するか、OneClickデプロイメントをインストールすると、バックグラウンドワーカーがdoworkイベントに参加しなくなりました。2つのリリース間でロジックは変更されていません。私は比較を行いましたが、エラーログを追加する以外に何も変更されていません。

doworkイベントにメッセージボックスとブレークポイントを含めるところまで行ってきましたが、自分のPC以外の場所には決して入りません。リモートデバッグしても、DoWorkイベントに参加しません

助言がありますか?

ボタンをクリックすると、runworkerasyncイベントも呼び出されます

private void ScanButton_Click_1(object sender, RoutedEventArgs e)
    {

        Scan = new BackgroundWorker();
        Scan.WorkerReportsProgress = true;
        Scan.DoWork += new DoWorkEventHandler(Scan_DoWork);
        Scan.ProgressChanged += new ProgressChangedEventHandler(Scan_ProgressChanged);
        Scan.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Scan_RunWorkerCompleted);
        Scan.RunWorkerAsync();
    }

以下は、DoWorkイベントを実行するコードです。簡単にするために、他の機能を削除しました。文字列を返し、それをscanresultsというリスト内に配置する関数を実行するだけです。

private BackgroundWorker Scan;

    public void Scan_DoWork(object sender, DoWorkEventArgs e)
    {

        System.Windows.Forms.MessageBox.Show("Inside the DoWork");

        BackgroundWorker bw = sender as BackgroundWorker;

        float percentageDone = 0.0F;

        ScanResults = new List<string>();

        try
        {

            System.Windows.Forms.MessageBox.Show("Doing first scan check");

            ScanResults.Add(Functions.LocalComputerName());
            percentageDone = ((1 / 1f) * 100f);
            bw.ReportProgress((int)percentageDone);

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }


public void Scan_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
            if (ScanResults.Count == 0)
            {
                System.Windows.Forms.MessageBox.Show("Empty");
                return;
            }
            MachineNameBox.Text = ScanResults[0];
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }

doworkイベントを完全に無視し、runworkercompleteイベントに入り、関数doがスキップされたためにリストが埋められていないため、明らかにインデックスのエラーを渡します。繰り返しますが、これは私のPCでは完全に機能しますが、他のPCにどのようにリリースしても、他のPCでは機能しません。

助けてくれてありがとう

4

3 に答える 3

19

私の推測では、あなたDoWorkは例外をスローしているので、あなたRunWorkerCompletedは呼び出されます。

BGWのメソッドでスローされた例外は、try ...catchin ;DoWorkではキャッチされないことに注意してください。RunWorkerCompleted代わりに、のパラメータのErrorプロパティがnullでないかどうかをチェックするパターンがあります。これがnullでない場合は、例外があります。RunWorkerCompletedRunWorkerCompletedEventArgs

RunWorkerCompleted次のようにコードを作り直すことができます。

public void Scan_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    if (e.Error != null) {
        // You have an exception, which you can examine through the e.Error property.
    } else {
        // No exception in DoWork.
        try {
            if (ScanResults.Count == 0) {
                System.Windows.Forms.MessageBox.Show("Empty");
                return;
            }
            MachineNameBox.Text = ScanResults[0];
        } catch (Exception ex) {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }
}

私のものよりも多くの情報とより良い例については、 BackgroundWorker.RunWorkerCompletedイベントを参照してください。

于 2011-11-24T08:21:25.377 に答える
0

私にとっては、メインプロジェクトが署名されていて、持ち込んだ新しいDLLは署名されていなかったということでした。警告やエラーが発生せず、プロジェクトが正常にコンパイルされたため、奇妙です。background_dowork()がデバッグでヒットすることさえないというだけです。DLLに署名証明書を追加すると、そのバックグラウンドワーカーは問題なく起動しました。

于 2018-12-27T18:43:03.010 に答える
0

Jay Riggsの答えは正しいですが、DoWorkの特定の問題によって引き起こされた例外が、 inに捕らえられないことtry...catchDoWorkを付け加えたいと思いました。これは、私にとって驚くべきことでした。

私のDoWorkルーチンがサードパーティのライブラリを使用し、そのライブラリが別のライブラリを使用していたという状況がありましたが、それは欠落していました。私のアプリケーションがを呼び出したとき、DoWorkライブラリはすぐには使用され、メソッド全体がにラップされていても、try...catchメソッドの外部で失敗し、すべてが正常であるかのように呼び出さRunWorkerCompletedれました。Errorしたがって、バックグラウンドジョブは何もしませんでしたが、例外もスローしませんでした。それは、私が知らなかったので、無視していたプロパティに例外を静かに配置しました。これを明らかにするには、非常に注意深いデバッグが必要でした。

私の要点は、エラーを常にチェックする必要がRunWorkerCompletedあり、これは非常に直感に反する動作であるということです。ジェイ・リッグスの答えがここになかったら、それを理解するのにどれくらいの時間がかかったか想像できません。

于 2020-02-14T15:32:03.230 に答える