2012-08-14 56 views
0

我的標題可能會讓我的問題聽起來令人困惑,但事實並非如此。通過ProgressBar顯示任務列表中的進度值

我有一個任務列表和一個ProgressBar。當我完成任務的列表循環,我想通過一個ProgressBar顯示進度:

 double percentage; 
     for(int i = 0; i < tasks.Count; i++) 
     { 
      percentage = (double)i + 1/(double)tasks.Count; 
      this.Invoke((MethodInvoker)delegate 
      { 
       progressBar1.Value = (int)Math.Round(percentage * 100); 
      }); 
      // Do tasks here... 
     } 

所以,如果我有說,20個任務我想progressBar1有5 ((1/20) * 100)值,那麼當它遍歷它的值又是10,15等等。我現在使用的方法無法正常工作,第一個任務progressBar1的值爲0,那麼當它再次循環時,它的值爲100.有沒有辦法實現我想要實現的目標?

謝謝。

+0

您是否正在更新主線程上的進度條?看起來你正在做一個工作方法'//在這裏執行任務...'但是我不能告訴 – dtsg 2012-08-14 07:45:02

+0

@Duane,他正在更新主UI線程上的進度條,注意'this。調用'調用。 – 2012-08-14 07:46:18

+0

@Duane我在工作線程上執行它們,因爲這些任務可能需要一些時間,我希望UI能夠顯示所有任務的進度。 – 3aw5TZetdf 2012-08-14 07:46:20

回答

4
for(int i = 0; i < tasks.Count; i++) 
{ 
    double percentage = (double)(i + 1)/(double)tasks.Count; 
    Action<double> update = p => 
    { 
     progressBar1.Value = (int)Math.Round(p * 100); 
    }; 
    this.Invoke(update, percentage); 
    // Do tasks here... 
} 
+0

謝謝,它完美的作品! – 3aw5TZetdf 2012-08-14 07:49:12

+0

已輸入相同! – Peru 2012-08-14 09:19:26

0

您的代碼應主要工作,但是我猜你的用戶界面僅僅是不能夠及時更新(即沒有上下文切換髮生的事情,你只返回一旦你完成控制)。我沒有那麼多涉及C#,多線程和UI編碼的經驗,所以我可能會在這裏稍微偏離一點。

一旦你開始在任務線程中完成你的任務,我在這裏試圖做的就是睡一會兒(甚至基本上是0秒應該做的伎倆)。

有點偏題:我想提一下,你有點過於複雜。只需將進度條的最大值設置爲任務數量,然後將其值增加1,即可在該循環內移除相當多的過時數學。

編輯:是的,剛剛注意到達林的答案,他是正確的:你也錯過了括號,導致你的百分比計算出錯。

但請記住,這樣做可能會導致您的總百分比由於精度錯誤而略微關閉(取決於任務數量無關緊要;但您可能無法準確命中100% )。

相關問題