2012-07-25 47 views
-1

我有大量的數據和Windows窗體控件從文件加載,當文件大小真的很大時,我得使用進度條。關於C#中的進度條完全凍結

事情是,進度條工作,但它會立即凍結程序開始構建數據並將其加載到窗體的時刻。

那麼,有無論如何,我可以使它工作?我使用後臺工作人員和進度條。

下面是一些代碼:

private void openToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     listBox2.Items.Clear(); 
     listBox3.Items.Clear(); 
     dataGridView1.RowCount = 0; 
     progressBar1.Visible = true; 
     reading.Visible = true; 
     backgroundWorker1.RunWorkerAsync(); 
     setLabels(); 
     progressBar1.Visible = false; 
     reading.Visible = false; 
    } 
     } 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
     // Wait 100 milliseconds. 
     Thread.Sleep(100); 
     // Report progress. 
     backgroundWorker1.ReportProgress(i); 
    } 
} 

private void backgroundWorker1_ProgressChanged(object sender, 
    ProgressChangedEventArgs e) 
{ 
    // Change the value of the ProgressBar to the BackgroundWorker progress. 
    progressBar1.Value = e.ProgressPercentage; 
    // Set the text. 
    reading.Text += " at " + e.ProgressPercentage.ToString() + "%"; 
} 
+3

有些代碼可能會有所幫助在這裏。我會猜測用戶界面被阻止,後臺工作人員沒有正確使用。 – 2012-07-25 10:26:10

+1

東西必須阻止你的UI線程更新..你能告訴我們你的代碼摘要嗎? – Shai 2012-07-25 10:26:30

+1

-1直到您提供詳細信息。 – Polynomial 2012-07-25 10:28:31

回答

1

你應該做一個單獨的線程的裝載工作,讓你的主線程處理更新UI。例如:

你可以揭開序幕,工人與你的文件來處理通過:

bgWorker.RunWorkerAsync(object); 

然後連上,你做你的長期運行的任務DoWork的方法,這是在那裏你會彙報在UI結果/進度百分比:

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{  
     object myObject = (object)e.Argument; 
     bgWorker.ReportProgress(//YOUR FORMULA TO WORK OUT PERCENTAGE); 
} 

ReportProgress的調用使用的ProgressChanged事件,你可以使用安全更新從後臺線程的UI:

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
     progressBar.Value = e.ProgressPercentage; 
} 
+0

也許他正在使用它: 「我使用後臺工作者和進度條一起...」 – laszlokiss88 2012-07-25 10:34:00

+0

對不起,它不起作用 – 2012-07-29 08:59:30

+0

它確實有效。張貼更多的代碼,因爲你可能已經搞砸了你的實現。 – dtsg 2012-07-30 07:26:11

0

東西必須阻止你的UI線程更新。做這種方式

私人無效updateProgressBar(INT%)的

{ 
     if (ProgressBar.InvokeRequired) 
     { 
      updateProgressBarCallback cb = new updateProgressBarCallback(updateProgressBar); 
      this.Invoke(cb, new object[] { percent }); 
     } 
     else 
     { 
      ProgressBar.Value = percent; 
      ProgressBar.Update(); 
      ProgressBar.Refresh(); 
      ProgressBar.Invalidate(); 
     } 
    }