2009-11-24 101 views
1

我想用backgroundworker更新我的進度條。只有這一點工作。這裏是我的代碼:C#進度條不會更新backgroundworker

private BackgroundWorker _worker; 

public Form1(string[] args) 
{ 
    InitializeComponent(); 

    // Backgroundworker to update the progressbar 
    _worker = new BackgroundWorker(); 
    _worker.WorkerReportsProgress = true; 
    _worker.ProgressChanged += worker_ProgressChanged; 
    _worker.DoWork += worker_DoWork; 
    _worker.RunWorkerCompleted += worker_WorkCompleted; 

} 

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    SendItems(); 
} 
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 
private void worker_WorkCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    _running = false; 
    HandleGui(); 
} 

private bool SendItems() 
{ 
    try 
    { 
     GetEvaluationDocumentsToSend(); 
     _worker.ReportProgress(16); 

     GetModifiedEvaluationDocumentsToSend(); 
     _worker.ReportProgress(32); 

     GetTasksToSend(); 
     _worker.ReportProgress(48); 

     GetPostToSend(); 
     _worker.ReportProgress(64); 

     GetContractDocumentsToSend(); 
     _worker.ReportProgress(80); 

     GetModifiedContractDocumentsToSend(); 
     _worker.ReportProgress(100); 

     return true; 
    } 
    catch (Exception e) 
    { 
     Log.WriteLog(e.ToString()); 

     MessageBox.Show(
      "The following error occured while sending the items: \r\n" + e.ToString(), 
      "Error", 
      MessageBoxButtons.OK, 
      MessageBoxIcon.Exclamation); 

     return false; 
    } 
} 

private void btnUpdate_Click(object sender, EventArgs e) 
{ 
    _worker.RunWorkerAsync(); 
} 

我沒有得到任何錯誤,但我的進度條不會更新。我究竟做錯了什麼?

+1

ProgressChanged事件是否實際觸發? – GenericTypeTea 2009-11-24 09:22:55

+0

是的。當我在方法調用和progressChanged事件上設置斷點時,首先執行該方法,然後執行progressChanged事件。 – Martijn 2009-11-24 09:29:54

+2

我測試了你的代碼,它工作正常。你還有其他設置進度欄的值嗎?另外,你的進度條的最小值和最大值是多少? – 2009-11-24 09:32:49

回答

3

它在我的機器上工作。 GetEvaluationDocumentsToSend()是做什麼的?也許它比其他方法花費的時間要長得多,所以看起來沒有進展,因爲所有的進展幾乎是瞬時的?另外,HandleGui()做什麼和_running用於什麼?

2

您沒有啓動BackgroundWorker!

事件訂閱後添加此行:

_worker.RunWorkerAsync(); 

編輯: 現在的代碼顯示調用的RunWorkerAsync()

嘗試每一次進步後增加了Thread.Sleep(1000)見如果你的進程太快......

+1

對不起,我忘記在我的代碼中提及。我會更新我的初始信息。 – Martijn 2009-11-24 09:18:07

0

嘗試添加在你的進度更新一個調用/ BeingInvoke電話:

this.BeginInvoke((MethodInvoker)delegate 
{ 
    progressBar1.Value = e.ProgressPercentage; 
}); 

這通常是UI沒有更新的原因。

+2

後臺工作人員的整個觀點就是要照顧到這一點。 – configurator 2009-11-24 09:28:55

+1

小心異步調用完成後始終調用EndInvoke。 http://msdn.microsoft.com/en-us/library/2e08f6yc%28VS.71%29.aspx – 2009-11-24 09:30:12

+0

公平點。作爲一個習慣,我仍然會這樣做。在這種情況下,我無法弄清楚爲什麼他的代碼不起作用,所以我只是提供一個可能性。 – 2009-11-24 09:31:34