c# - 如何正确隐藏按钮并在后台工作人员执行某些操作后显示它?

标签 c# winforms backgroundworker

这是我迄今为止尝试过的:

  1. button.Visible = false 放入表单的初始值设定项中,并将 button.Visible = true 放入 backgroundWorkers 的 DoWork 事件的末尾。
    这会导致程序在BackgroundWorker 完成工作后卡住。
    我不明白为什么。

  2. button.Visible = false 放入表单的初始值设定项中,并将 button.Visible = true 放在 backgroundWorker1.RunWorkerAsync() 后面> 打电话。
    这无法正常工作,因为它在BackgroundWorker开始工作后立即显示按钮。
    我确实明白为什么会发生这种情况。

  3. button.Visible = falsedoneEvent = 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/

相关文章:

c# - System.Data.Common.DbDataReader.ReadAsync 中的异步是什么?

c# - 无法在 Windows 窗体设计器上使用鼠标移动控件

c# - 在 WPF 中使用计时器刷新 UI(使用 BackgroundWorker?)

c# - 当自动调整大小打开时,获取 ListView 中列的实际宽度

c# - 如何在 Windows 窗体应用程序中设计自定义关闭、最小化和最大化按钮?

C#-后台 worker 的 CancelAsync() 不工作?

c# - 如何以正确的方式处理 BackgroundWorkers

c# - 使用 C# 获取特定 XML 元素值的问题

c# - DbQuery 与 IQueryable SQL 性能对比

c# - 如何为Windows应用程序创建.exe文件