如何在BackgroundWorker执行某些操作后正确隐藏按钮并显示它?

iCa*_*arn 2 c# backgroundworker winforms

这是我到目前为止所尝试的:

  1. 放入button.Visible = false我的表单的初始化程序,并button.Visible = true结束我的ba​​ckgroundWorkers的DoWork事件.
    这会导致程序在BackgroundWorker完成其工作后冻结.
    我不明白为什么.

  2. 放入button.Visible = false我的表单的初始化程序并button.Visible = true在我的backgroundWorker1.RunWorkerAsync()调用之后.
    这不能正常工作,因为它在BackgroundWorker开始工作后立即显示按钮.
    我明白为什么会这样.

  3. 将button.Visible = false与doneEvent = new AutoResetEvent(false)入我的窗体的初始化,然后把doneEvent.WaitOne()和button.Visible = true我的后backgroundWorker1.RunWorkerAsync()调用.
    这样,一切正常,除了我的表单中的ProgressBar停止正常工作(直到完成所有工作才显示进度).
    我可能有一个直观的想法,为什么会发生这种情况,但我真的不明白它,我不知道如何解决它.

Ste*_*eve 5

当代码在DoWork事件中运行时,不应该在按钮上调用任何方法/属性,因为此代码与创建按钮的线程位于不同的线程中.
该BackgroundWorkwer使用一个定义良好的组事件来处理,你需要更新你的接口的情况下,你应该使用这些事件该任务.

例如,您可以将该属性设置WorkerReportsProgress为true,订阅该事件ProgressChanged并backgroundWorker1.ReportProgress(...);在DoWork事件内调用以在后台工作进度时更新您的界面.

在您的情况下,您可能需要订阅该活动RunWorkerCompleted并在该活动中显示您的按钮

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (!e.Cancelled && e.Error == null)
    {
        button.Visible = true; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在BackgroundWorker的MSDN页面链接中,有一个示例演示了在DoWork事件运行复杂任务时如何更新进度条.