在运行BackgroundWorker之前更新UI

时间:2013-08-05 08:22:01

标签: c# wpf multithreading user-interface backgroundworker

我有这个小问题,但不容易解决。目前,我的程序有2个按钮,一个"开始"和"取消"。当用户点击开始时,按钮应立即显示:

  

StartButton.IsEnabled = false;

     

CancelButton.IsEnabled = true;

但这只发生在BackgroundWorker完成后(按下按钮后将运行的所有代码),因为UI总是最后更新。我无法将这些命令添加到" ProgressChanged"或"已完成"背景工作者的事件。这些事件最多可能需要10分钟才能完成。

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

这有什么简短的解决方案吗?

将Button.Property更改添加到ClickEvent并不起作用。这是这个问题的主要问题。我可以很容易地使用"已完成" BGW的一部分将Button改回以匹配起始状态。问题是在所有事件和BGW之前将它们设置好。

3 个答案:

答案 0 :(得分:0)

如果你有一个开始按钮,如:

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发送消息,请使用hereInvoke方法

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

  }

并做

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

答案 1 :(得分:0)

看看我之前的一个问题(非常类似)。我应该选择选项1.

ASP.NET Application log while code is running / progress bar

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

答案 2 :(得分:0)

您可以在该按钮本身的单击事件中禁用启动按钮,并在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
}