在运行BackgroundWorker之前立即更新UI

本文关键字:更新 UI 运行 BackgroundWorker | 更新日期: 2023-09-27 18:26:30

我有一个非常小的问题,但它不容易解决。目前,我的程序有两个按钮;启动";和一个";取消";。当用户点击开始时,按钮应该立即消失:

StartButton.IsEnabled=false;

CancelButton.IsEnabled=true;

但只有当BackgroundWorker完成(按下按钮后将运行的所有代码)时才会发生这种情况,因为UI总是更新为最后一个。我不可能将这些命令添加到";ProgressChanged";或";已完成";幕后工作者的事件。这些活动可能需要10分钟才能完成。

一种简单的方法是将这些命令添加到";ProgressChanged";部分,并且最后";完整的";再次改变他们的状态。但我想避免这种情况,因为按钮应该一直显示它们的真实状态,而不是在几秒钟后;ProgressChanged";事件。当然,总有办法的,比如不使用按钮的UI属性。

对此有什么简单的解决方案吗?

添加按钮无效。属性更改为ClickEvent。这是主要的问题。我可以很容易地使用";已完成";BGW的一部分,以更改按钮的背面以匹配启动状态。问题是在所有事件和BGW之前将它们设置好。

在运行BackgroundWorker之前立即更新UI

如果您有一个启动按钮,如:

this.StartButton = new System.Windows.Forms.Button();

然后你可以做

this.StartButton.Click += new System.EventHandler(this.button1_Click);

然后做

  private void button1_Click(object sender, EventArgs e)
  {
     StartButton.IsEnabled = false;
     CancelButton.IsEnabled = true;
     Thread bg = new Thread(new ThreadStart( UpdateDatabase()));
     bg.Start();
  }

如果希望bg线程向UI发送消息,请使用Invoke方法,如

  public delegate void UpdateUIHndler();
  public void UpdateUI()
  {
  }

并进行

     if (InvokeRequired)
     {
        Invoke(new UpdateUIHndler(UpdateUI));
     }

看看我之前的一个问题(很相似)。我应该选择选项1。

代码运行时的ASP.NET应用程序日志/进度条

UI只会延迟5秒。使用AJAX更新按钮样式,而不是文本。

您可以在按钮本身的点击事件中禁用启动按钮,并在BGW的RunWorkerCompleted事件中再次启用,如下所示

BackgroundWorker _worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
private void StartButton_Click(object sender, RoutedEventArgs e)
{
   startButton.IsEnabled = false;
}
 void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
    stratButton.IsEnabled = true;
 }
void _worker_DoWork(object sender, DoWorkEventArgs e)
{
  //Your processing code
}