我有一个更新缓慢加载项目的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 :(得分:2)
您可以使用Task.WhenAll方法来达到此目的。或使用TaskFactory.ContinueWhenAll,然后您可以将控件编组到UI线程。
答案 1 :(得分:0)
将您的Parallel.WaitAll()
放入另一项任务。
答案 2 :(得分:0)
您可以尝试触发另一个执行Task.WaitAll()的任务,并在之后通知您的用户界面。
答案 3 :(得分:0)