这是我迄今为止尝试过的:
将
button.Visible = false
放入表单的初始值设定项中,并将button.Visible = true
放入 backgroundWorkers 的 DoWork 事件的末尾。
这会导致程序在BackgroundWorker 完成工作后卡住。
我不明白为什么。将
button.Visible = false
放入表单的初始值设定项中,并将button.Visible = true
放在backgroundWorker1.RunWorkerAsync()
后面> 打电话。
这无法正常工作,因为它在BackgroundWorker开始工作后立即显示按钮。
我确实明白为什么会发生这种情况。- 将
button.Visible = false
和doneEvent = new AutoResetEvent(false)
放入表单的初始值设定项,然后放入doneEvent.WaitOne()
和button.Visible = true
在我的backgroundWorker1.RunWorkerAsync()
调用之后。
这样,一切工作正常除了我的表单中的进度条停止正常工作(直到所有工作完成后才显示进度)。
我可能对为什么会发生这种情况有一个直观的想法,但我并不真正理解它,也不知道如何解决它。
最佳答案
当代码在 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;
}
}
BackgroundWorker 的 MSDN 页面链接中有一个示例,演示如何在 DoWork 事件运行复杂任务时更新进度条。
关于c# - 如何正确隐藏按钮并在后台工作人员执行某些操作后显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779186/