2011-07-18 62 views
0

我试图在我的C#添加一个进度条的Excel插件中,进度条显示,但它并不表示任何进展,直到函数执行完毕。C#windows窗体与后台工作的进度条

这些都是在Windows窗体类的功能:

public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
     { 

      Thread.Sleep(100); 

      backgroundWorker1.ReportProgress(i); //run in back thread 


     } 

    } 



    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) //call back method 
    { 

     progressBar1.Value = e.ProgressPercentage; 

    } 

    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) //call back method 
    { 

     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; 

    } 

我应该如何改变这种做法,进展bar在执行FUNCTIONTORUN()期间不会停止工作?进度条使用Visual Studio设计器进行初始化。表单类中的进度条对象的名称是progressbar1。

谢谢!

回答

3

DoWork事件的进度条应该是(或包含)FUNCTIONTORUN()FUNCTIONTORUN()应该使用ReportProgress方法。

2

是什么FUNCTIONTORUN办?这很可能会阻塞UI线程,导致进度条的更新在返回之前不会被看到。更有可能的是,FUNCTIONTORUN需要在后台工作人员中运行,并定期报告进度,这就是您更新进度栏的地方。

0

我想在下面的语句扩大。如果我错了,Matt Greer能纠正我。

是什么FUNCTIONTORUN办?它很可能会阻止UI线程, 导致进度条的更新无法看到,直到它返回 。更可能的,FUNCTIONTORUN需要在后台 工人运行,并将其定期汇报进展,而这也正是 你更新进度条。

我相信他指这是你需要内 FUNCTIONTORUN更新progressBar1.Value();你仍然可以使用类似的方法。