1

バックグラウンド ワーカーがプロセスを実行した後、フォームの特定のラベルのテキストを変更したいと考えています。

バックグラウンドワーカーを起動するボタンは次のとおりです。

private void btnProcessImages_Click(object sender, EventArgs e)
        {
            DialogResult processImagesWarnMsg = MessageBox.Show("You're about to process images, are you sure?", "Warning!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);

            if (processImagesWarnMsg == DialogResult.Yes)
            {
                DisableAllButtons();

                if (!processImagesWorker.IsBusy)
                {
                    processImagesWorker.RunWorkerAsync();
                }
                //The problem here is that the below will run BEFORE the worker is complete. Where should I place the below method in my code? 
                //ResetDirectoryStatistics();
            }
        }

フォームのラベルのテキストを変更するメソッドは次のとおりです。

private void ResetDirectoryStatistics()
        {
            lblSelectedDirectory.Text = "N/A";
            lblTotalNumberOfFilesInDirectory.Text = "N/A";
            lblTotalNumberOfSupportedFilesInDirectory.Text = "N/A";
            lblTotalNumberOfUnsupportedFilesInDirectory.Text = "N/A";
            lblTotalNumberOfPoliciesInDirectory.Text = "N/A";
        }

バックグラウンド ワーカーを処理する場合、ResetDirectoryStatistics メソッドをどこに配置すればよいですか? クロススレッドになるため、バックグラウンドワーカーの「DoWork」メソッドに配置できません。また、processImagesWorker.RunWorkerAsync(); の直後にメソッドを配置すると、RunWorker が完了する前にメソッド自体が実行されます。

4

2 に答える 2

6

RunWorkerCompletedバックグラウンド ワーカーのイベントでメソッドを呼び出す必要があります。このイベントは UI スレッドを使用するため、クロススレッドの問題を心配する必要はありません。

于 2012-08-31T15:10:15.960 に答える
2

RunWorkerCompletedのイベントにすべてのコードを配置するだけですBackgroundWorker

イベントが UI スレッドで確実に実行されるように処理するので、呼び出しなどについて心配する必要はありません。

于 2012-08-31T15:10:07.553 に答える