在运行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之前将它们设置好。
如果您有一个启动按钮,如:
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
}