2013-09-01 24 views
3

我有一個更新緩慢加載項目的UI程序。我設法讓項目並行加載,並在加載完成後立即顯示每個項目。但是,我想在加載時顯示進度條,並在加載所有項目後隱藏它。如何在最後一項任務完成時停止進度條?

private void refreshButton_Click(object sender, EventArgs e) 
{ 
    foreach (var item in Items) 
    { 
     progressBar1.Visible = true; 
     Task.Factory 
      .StartNew(() => DoNonUiwork(item)) 
      .ContinueWith(antedecent => 
      { 
       UpdateUI(antedecent.Result); 
       if (/* if what? */) 
       { 
        progressBar1.Visible = false; 
       } 
      } 
     , TaskScheduler.FromCurrentSynchronizationContext()); 
    } 
} 

我能記得我的所有任務,並在他們身上使用Parallel.WaitAll(),但後來我會阻塞UI線程,這是不是很好。

我可以設置一個自制同步機制 - 可能是一個以int itemsToUpdate = Items.Count()開頭的計數器,然後/* if what? */變成--itemsToUpdate== 0。它的工作原理,但並不覺得很任務般的...

是否有任務母語的方式來做到這一點?

+0

只需增加一個計數器,當你開始一個任務,減少它完成後。當它達到0時,PB應該消失。 –

+0

您可以像建議@HansPassant一樣使用解決方法,但請記住您的任務運行在不同的線程中。 –

+0

不,計數保證在同一個線程上運行。如果沒有,那麼更新PB也無法工作。 –

回答

0

把你的Parallel.WaitAll()還有另一個任務

0

你可以嘗試發射了另一項任務,做Task.WaitAll()和後通知您的UI。

0
  1. 創建父任務。
  2. 附上所有任務父。
  3. 在父延續隱藏進度條。
相關問題