[英]C# windows form progress bar with a function on background worker
我正在尝试在我的c#excel add in中添加进度条(MARQUEE样式)。进度条出现但在功能执行完毕之前它并不表示任何进度,这意味着它仍然处于冻结状态。
这些是Windows窗体类中的函数:
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
//run in back thread
backgroundWorker1.ReportProgress(i);
}
}
//call back method
public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
//call back method
public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = progressBar1.Maximum;
}
这是我从添加按钮调用该函数的方法:
private void buttonClicked(object sender, RibbonControlEventArgs e)
{
AddInPlanView.Form1 pBar = new AddInPlanView.Form1();
pBar.Visible = true;
pBar.backgroundWorker1.WorkerReportsProgress = true;
pBar.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(pBar.backgroundWorker1_ProgressChanged);
pBar.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(pBar.backgroundWorker1_DoWork);
pBar.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(pBar.backgroundWorker1_RunWorkerCompleted);
pBar.backgroundWorker1.RunWorkerAsync();
FUNCTIONTORUN();
pBar.Visible = false;
}
我的代码现在尝试将进度条放在后台工作者上。 我知道我应该切换这个,以便FUNCTIONTORUN()
应该是后台工作者,但我该怎么做呢? 由于它是一个选取框进度条,我根本不需要更新进度条的值,它只需要运行直到FUNCTIONTORUN()
结束。 请注意, FUNCTIONTORUN()
更新Excel工作表的单元格。
使用Visual Studio设计器初始化进度条。 表单类中ProgressBar
对象的名称是progressbar1
。
要启动选框样式进度条,请键入
progressbar1.Style = ProgressBarStyle.Marquee;
progressbar1.MarqueeAnimationSpeed = 100;
停止选框类型
progressbar1.MarqueeAnimationSpeed= 0;
资料来源: http : //social.msdn.microsoft.com/forums/en-US/winforms/thread/9e51ad57-988e-4c17-98f0-cd2a8abec503/
FUNCTIONTORUN(); // make your UI thread busy.
System.Windows.Forms.Application.DoEvents(); // might help in this case.
在大多数情况下,DoEvent没有帮助(根据我的经验)。 因此,让流程栏顺利运行是非常困难的。
当后台工作程序完成时,只需停止进度条。
在此函数内部, pBar.backgroundWorker1_RunWorkerCompleted
只需调用进度条的Stop函数。
你的FUNCTIONTORUN()
阻止了UI线程。
在长时间运行的函数中传播一些System.Windows.Forms.Application.DoEvents()
来处理事件(因此UI更新)。
如上所述,这将更新UI并让应用程序响应其他事件。
您可能希望禁用触发此长时间运行功能的按钮或其他长时间运行的功能。
我相信你必须将FUNCTIONTORUN()置于sepratae线程中,并且仍然执行调用ReportProgress方法,以便提升backgroundWorker1_ProgressChanged
,你可以更新你的porgress bar值。 我想,因为我没有在提供的代码中看到它,所以不要在代码中的某处调用ReportProgress
函数。
编辑 :看到ReportProgress
功能。
因此,将您的函数移动到单独的线程中,并将进度条的值更新为主线程。
希望这可以帮助。
问候。
您可以使用DoWork创建一个额外的后台工作程序,其中包含对其内部的FUNCTIONTORUN()的调用,以及一个使您的栏停止或不可见的RunWorkerCompleted。 然后,不要调用FUNCTIONTORUN(),而是调用backGroundWorker2.RunWorkerAsync();
这应该可以防止该功能冻结您的UI。 去年夏天我遇到了这个问题几乎完全相同的事情,并使用backgroundworkers修复它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.