我有一个更新缓慢加载项目的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也无法工作。 –