2013-06-18 45 views
-1

原因可能是我的Processbar1ReportProgress分别只触发一次?Backgroundworker ReportProgress只触发一次?

我第一次点击按钮,一切都按预期工作。除了ProgressBar1之外,所有进一步的点击每件事都还在工作!

我可以在调试器中看到progressBar1.Value在第一次运行中得到期望值,所有进一步运行progressBar1.Value总是包含“0”。

最奇怪的是它运行的是foreach-loop,所有的东西都被执行,即使b.ReportProgress(i * 100/x)中的值都正确,但没有成功的进度条。
i =电流回路计数
x =总回路计数

这里是我的代码片段:

BackgroundWorker b = new BackgroundWorker(); 

    public Form() 
    { 
     InitializeComponent(); 

     b.WorkerReportsProgress = true; 
     b.DoWork += new DoWorkEventHandler(b_DoWork); 
     b.RunWorkerCompleted += new RunWorkerCompletedEventHandler(b_RunWorkerCompleted); 
     b.ProgressChanged += new ProgressChangedEventHandler(b_ProgressChanged); 
    } 

    void b_DoWork(object sender, DoWorkEventArgs e) 
    { 
     int i = 0; 
     int x = xxx.MaxValue; 
     foreach (var item in collection) 
     { 
      //... somecode ...(item); 
      b.ReportProgress(i * 100/x); 
      i++; 
     } 
     //... somecode 
     e.Result = dt; 
    } 

    void b_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage; 
    } 

    void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     GridView.DataSource = e.Result; 
     GridView.Update(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     b.RunWorkerAsync(); 
    } 

编辑:

private void btnClearGrid_Click(object sender, EventArgs e) 
    { 
     dt.Clear(); 
     GridView.DataSource = dt; 
     GridView.Update(); 
    } 

我已经找到了问题..
问题是,我试图清除的GridView在我运行Backgroundworker之前,这个包含GridView.DataSource = dt;的点击事件将一个额外的数据源绑定到网格(我认为是这样),而不是清除网格。

private void btnClearGrid_Click(object sender, EventArgs e) 
    { 
     dt.Clear(); 
     GridView.DataSource = null; 
    } 
+0

什么是'价值'int x = xxx.MaxValue;'语句之后的x'你的解释告诉它是循环计数的总数,但我似乎并不是。 –

+0

从上面的问题描述中,'i ++'只在第一次运行时发生。我们可能需要查看更多代码。 – Bolu

+0

x =只是文件中行的总数(实际上= 129886),我也将它用作“foreach-loop”的集合。 _可以是任何值。但是我发现progressBar正在工作,第二次运行的时候非常慢,然后我运行'button1_Click-Event'。 – MrMAG

回答

0

尝试点击之间重置进度条:

private void button1_Click(object sender, EventArgs e) 
{ 
    progressBar1.Value = 0; 
    b.RunWorkerAsync(); 
} 
+2

在做任何事之前不应该检查'BackgroundWorker.IsBusy',所以如果'BackgroundWorker'已经在运行,你不会得到'InvalidOperationException'? –

+0

是@Bob,你说得对,我马上加上检查。谢谢 – MrMAG

+0

@MrMAG将这两条语句的检查结果包裹在一起,如果使用此语句,则不必在每次单击时重置进度条。 –

1

我是有问题的,这是依赖于更新进度,这是我加入明确的线程休眠到DoWork的方法解决的速度。 IE:

b.ReportProgress(i * 100/x); 
Thread.Sleep(50); 

(同时检查50毫秒这一部分是不以多少比较实际工作中进行;如果是报告进展情况&睡眠只是偶尔)