1

C# で動作する非常に基本的な Windows フォーム アプリがあり、 Background Workerを試していました。ほとんどの場合、そのページの基本コードに従いました。

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
            progressBar.Value = e.ProgressPercentage;
    }

実行中にウィンドウが閉じられたときにバックグラウンドワーカーが作業を行っている場合 (たとえば、X を押す) を除いて、すべてがうまく機能します。上記のメソッドは null 参照例外をスローしています (progressBar で推測しますか?)。

私はこれをクロージングメソッドに入れました:

    private void Form_FormClosing(object sender, FormClosingEventArgs e)
    {
        if(bgWorker.WorkerSupportsCancellation == true)
            bgWorker.CancelAsync();
    }

しかし、これで問題は解決しませんでした。なぜこれが起こっているのか疑問に思っていprogressBarます。その行を削除すると、ビジー状態でウィンドウを閉じても例外がスローされないため、に分離されていることがわかっています。

4

1 に答える 1

2

はい、ウィンドウを閉じると、ProgressBar を含むコントロールが破棄されます。チェックせずに Bgw からアクセスしようとすると、エラーが発生します。

次のように保護できます。

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   if ((progressBar == null) || progressBar.IsDisposed)
       return;

   progressBar.Value = e.ProgressPercentage;
}

また、Bgw もキャンセルすることをお勧めしますがCancelAsync()、それだけでは十分ではありません。のコードはDoWork()、キャンセル フラグをチェックする必要があります。

于 2012-06-25T14:24:23.597 に答える