1

后台工作人员完成其进程后,我想更改表单上某些标签上的文本。

这是触发 backgroundworker 的 Button:

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 回答