C# 在多个后台工作人员完成后更新 UI

标签 c# user-interface backgroundworker

简单的问题:我有四个 C# 后台工作人员,需要几分钟甚至几个小时才能完成。我不想在那段时间锁定我的用户界面。当用户单击按钮1时,我让按钮自行关闭:

button1.Enable = false;

我希望在所有后台工作完成时重新启用该按钮并更新标签。如何做到这一点?

详细问题: 我有 4 个后台工作人员声明为 BGW1、BGW2 等。

private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    BGW1.RunWorkerAsync();
    BGW2.RunWorkerAsync();
    BGW3.RunWorkerAsync();
    BGW4.RunWorkerAsync();
    button1.Enabled = true;
}

尽管没有任何工作人员完成,但该按钮仍处于启用状态。 在任何后台工作完成语句中调用button1.Enabled = true将在其他工作完成之前启用该按钮。

创建任何类型的公共(public)整数并执行 while 循环似乎也会锁定 UI。有什么方法可以使公共(public)整数休眠主线程而不锁定 UI,直到该整数返回到 0?或者也许是处理后台工作人员跟踪的更好方法。

最佳答案

您无需任何循环即可执行此操作。订阅RunWorkerCompletedEvent对于所有后台工作人员。当工作人员完成时,将引发此事件。然后,您可以在事件处理程序中检查所有四个后台工作人员的状态,例如:

private void button1_Click(object sender, EventArgs e)
{
    this.button1.Enabled = false;

    this.BGW1.RunWorkerAsync();
    this.BGW2.RunWorkerAsync();
    this.BGW3.RunWorkerAsync();
    this.BGW4.RunWorkerAsync();
}

private void BGW1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    RefreshButtonState();
}

private void BGW2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    RefreshButtonState();
}

private void BGW3_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    RefreshButtonState();
}

private void BGW4_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    RefreshButtonState();
}

private void RefreshButtonState()
{
    this.button1.Enabled = !this.backgroundWorker1.IsBusy && 
                           !this.backgroundWorker2.IsBusy && 
                           !this.backgroundWorker3.IsBusy && 
                           !this.backgroundWorker4.IsBusy;
}

关于C# 在多个后台工作人员完成后更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37256437/

相关文章:

c# - 如何使用 LINQ 对集合中的每个字符串调用 ToLower()?

c# - 在 Linq 的 Where 子句中使用条件

python - 如何在 Python 的 Tkinter 中制作一个交互式列表,并包含可以编辑这些列表的按钮?

c# - 在我们的页面内打开外部页面

c# - 如何在日历中保留所有日期选择?

c# - 从 wp8 应用程序中的单独线程更新 UI

java - java 导入如何工作(swing)?

amazon-web-services - AWS Elastic Beanstalk - 启动 SWF 后台工作线程

haskell - 保持后台进程在 heroku 上运行

c# - 当我需要抓取网站时,我应该使用 BackgroundWorker 还是 Threads?