我有一個更新緩慢加載項目的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時,PB應該消失。 –
您可以像建議@HansPassant一樣使用解決方法,但請記住您的任務運行在不同的線程中。 –
不,計數保證在同一個線程上運行。如果沒有,那麼更新PB也無法工作。 –