2012-11-14 90 views
1

關於如何實現進度條的問題一直存在,我相信我已經完成了所有這些工作,但我仍然不知道爲什麼我的進度條無法工作。使用backgroundworker的進度條

好吧,它似乎只在操作完成後才起作用,這當然不是我想要的。我希望進度條能夠正常工作,因爲主要操作正在進行。

我的代碼很長很痛苦,所以我打算簡化它使其儘可能基本。

private void button1_Click(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
    //Main UI Operation 
} 

private void BackgroundWorker_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 BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs  e) 
    { 
    progressBar1.Value = e.ProgressPercentage; 
    } 

就像我說的,我只看到進度條在我的主UI操作後開始。

WorkerReportsProgress設置爲True。 最小值和最大值分別爲0和100。

我覺得這可能是對線程缺乏理解。

+0

它是Windows窗體還是WPF? –

+0

「//主要用戶界面操作」是否意味着活動在那裏發生並且您已將其排除在外?如果是這樣,那就是你的問題。如果'button1_Click()'立即返回,那麼問題就在別處。 – siride

+0

Siride,「\\ Main UI Operation」是我稱之爲需要花費大量時間完成的方法的地方。爲什麼這是一個問題,我該如何解決?我對這個方法甚至準確嗎?還是你會以不同的方式去做? –

回答

1

我測試了和你一樣的代碼,發現它工作。你忘了將WorkerReportesProress屬性更改爲True嗎?

+0

是的,我確定它被設置爲True –

+0

對不起,不知道。 我認爲你應該將'Main UI Operation'分成小步驟並用一步代替'Thread.Sleep(100);'。 或者您可以創建一個新的BackgroundWorker對象並將'// Main UI Operation'放入其中。 – acadia

+0

由於進度欄更新和按鈕單擊都在UI線程中運行,因此在button1_click返回之前,進度欄事件將不會運行。 – acadia

相關問題