2012-02-20 52 views
-1

我遇到了一個問題,我似乎無法找出解決方案,我已經閱讀了幾個答案,並已知道我需要一個BackgroundWorker線程使這個解決方案有效,但我仍然遇到一些問題。在後臺的進度欄工人沒有加載

我有一個小尺寸的第二個窗體,並將其設置爲屏幕中央,並將ProgressBar樣式設置爲「選取框」,此第二個窗體上沒有其他任何內容,因爲它旨在模擬加載欄。

在我的數據的代碼的密集部分,主要形式,其中它抓住和從我已經它寫成這樣一個數據庫解析數據上:

GetData() 
{ 
     bwLoading.RunWorkerAsync(); 
     //Runs all the processing 
     bwLoading.CancelAsync(); 
} 

背景工人在下面定義爲這樣,也是主要的形式。

private void bwLoading_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     frmLoading lb = new frmLoading(); 
     bool running = true; 
     while (running) 
     { 
      if ((worker.CancellationPending == true)) 
      { 
       lb.Close(); 
       running = false; 
      } 
      else 
      { 
       lb.Show(); 
      } 
     } 

    } 

我所遇到的問題是,用這種方法,顯示了包含進度條也顯示當數據開始被收集和處理以及數據加載完成後不會消失裝載形式,但該窗口是空的,就像它試圖加載,但它沒有。我似乎無法弄清楚爲什麼這不起作用。

是不是後臺工作人員爲加載表單創建單獨的線程來使用?還是有我從閱讀中錯過的其他東西?

+0

爲什麼CancelAsync?試圖消除這一點? – 2012-02-20 23:22:23

+0

並且:不要在DoWork()中創建或顯示錶單。 – 2012-02-20 23:23:48

+0

@HenkHolterman我不相信你正確理解我的問題。我正在處理時顯示一個「繁忙」框。取消是爲了讓後臺工作人員知道何時隱藏「繁忙」框。 – Sorean 2012-02-20 23:48:53

回答

3

您必須使用ReportProgress()實際報告後臺操作的進度。這要求你知道你已經完成了多少工作。

如果你沒有報告進度,進度條會一直保持在0%,直到你的後臺操作完成,然後消失 - 這就是你正在觀察的。

編輯:

在您的評論的光 - 您使用的是帳篷式的進度條 - 我認爲這個問題是在這裏:

GetData() 
{ 
     bwLoading.RunWorkerAsync(); 
     //Runs all the processing 
     bwLoading.CancelAsync(); 
} 

我懷疑你從UI線程執行GetData()方法 - 這意味着UI線程被阻止,進度條無法更新。將所有處理移動到bwLoading_DoWork方法,以便在單獨的線程上執行,而不是在UI線程上執行 - 那麼應該更新進度欄。還要刪除bwLoading.CancelAsync()調用 - 這將僅用於取消。

+0

但表單設置爲選取框樣式。這是否仍然需要報告進展? – Sorean 2012-02-20 23:46:35

+0

還是我誤解它,我需要一個後臺工作負載的第二個窗體? – Sorean 2012-02-21 00:31:58

+0

@JKM:不,你錯了,我錯過了跑馬燈風格 - 你不應該在這種情況下報告進度,所以問題是其他地方。您是否將進度條設置爲可見? – BrokenGlass 2012-02-21 01:08:48