当最后一项任务完成时,如何停止进度条
本文关键字:何停止 完成时 任务 最后 一项 | 更新日期: 2023-09-27 18:29:53
我有一个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
。它有效,但感觉不太像任务。。。
有没有任务本机的方式来实现这一点?
您可以使用Task.WhenAll方法来实现此目的。或者使用TaskFactory.ContinueWhenAll,然后可以将控件编组到UI线程。
将Parallel.WaitAll()
放入另一个任务中。
您可以尝试启动另一个执行Task.WaitAll()并在之后通知UI的Task。
- 创建父任务
- 将所有任务附加到父任务
- 在父级继续中隐藏进度条