C#窗口在后台工作者上形成一个具有function的进度条

我试图添加一个进度条(MARQUEE风格)在我的c#excel添加英寸进度条出现,但它并没有表明任何进展,直到function完成执行,这意味着它仍然冻结。

这些是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; } 

这就是我如何从添加button调用函数:

  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 Studiodevise器进行初始化。 表单类中的ProgressBar对象的名称是progressbar1

启动一个选框样式进度条,input

 progressbar1.Style = ProgressBarStyle.Marquee; progressbar1.MarqueeAnimationSpeed = 100; 

停止选取框types

 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并没有帮助(根据我的经验)。 所以,要让stream程栏顺利运行是非常困难的。

后台工作人员完成后,只需停止进度栏。

在这个函数的内部,只需调用进度条的Stop函数就可以调用pBar.backgroundWorker1_RunWorkerCompleted

我相信你必须把FUNCTIONTORUN()放入sepratae线程,并且仍然是执行调用ReportProgress方法,以便提高backgroundWorker1_ProgressChanged ,在那里你可以更新你的porgress栏值。 我想,因为我没有在提供的代码中看到它,所以不要在代码中的某处调用ReportProgress函数。

编辑 :看到ReportProgressfunction。

因此,将你的函数移动到单独的线程中,并将进度条的值更新到主线程中。

希望这可以帮助。

问候。

你的FUNCTIONTORUN()阻塞UI线程。
在长时间运行的函数中传播一些System.Windows.Forms.Application.DoEvents()来处理事件(所以UI更新)。
如上所述,这将更新UI并让应用程序响应其他事件。
您可能想要禁用触发此长时间运行的函数的button或其他长时间运行的函数。

您可以使用一个包含对您的FUNCTIONTORUN()的调用的DoWork创build一个额外的后台工作人员,以及一个RunWorkerCompleted,使您的酒吧停止或不可见。 然后,不要调用FUNCTIONTORUN(),而是调用backGroundWorker2.RunWorkerAsync();

这应该防止function冻结你的用户界面。 去年夏天我遇到了这个问题,几乎完全一样,用backgroundworkers修复了这个问题。