我正在尝试在我的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
。
答案 0 :(得分:1)
启动选框样式进度条,输入
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/
答案 1 :(得分:1)
FUNCTIONTORUN(); // make your UI thread busy.
System.Windows.Forms.Application.DoEvents(); // might help in this case.
在大多数此类案例中,DoEvent没有帮助(根据我的经验)。因此,让流程栏顺利运作是非常困难的。
答案 2 :(得分:0)
当后台工作人员完成时,只需停止进度条。
在此函数pBar.backgroundWorker1_RunWorkerCompleted
内部,只需调用进度条的“停止”功能。
答案 3 :(得分:0)
您的FUNCTIONTORUN()
阻止了UI线程
在长期运行的函数中传播一些System.Windows.Forms.Application.DoEvents()
来处理事件(因此UI更新)
如上所述,这将更新UI并让应用程序响应其他事件
您可能希望禁用触发此长时间运行功能的按钮或其他长时间运行的功能。
答案 4 :(得分:0)
我相信你必须把FUNCTIONTORUN()放到sepratae线程中,而且它仍然是执行调用
ReportProgress方法,以便在backgroundWorker1_ProgressChanged
处升级您可以更新您的porgress栏值。我想,因为我在提供的代码中没有看到它,所以不在代码中的某处调用ReportProgress
函数。
已编辑:看到ReportProgress
功能。
因此,将您的函数移动到单独的线程中,并将进度条的值更新为主线程。
希望这有帮助。
问候。
答案 5 :(得分:0)
您可以使用DoWork创建一个额外的后台工作程序,其中包含对其内部的FUNCTIONTORUN()的调用,以及一个使您的栏停止或不可见的RunWorkerCompleted。然后,不要调用FUNCTIONTORUN(),而是调用backGroundWorker2.RunWorkerAsync();
这可以防止该功能冻结您的UI。我去年夏天遇到了这个问题几乎完全相同的事情,并使用backgroundworkers修复了它。