2009-11-24 93 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