2013-06-18 104 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毫秒這一部分是不以多少比較實際工作中進行;如果是報告進展情況&睡眠只是偶爾)