简单的问题:我有四个 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/