我有一个 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()
开头的计数器,然后是 /* 如果是什么? */
变为 --itemsToUpdate== 0
。它有效,但感觉不太像任务......
是否有 Tasks 原生方法来完成此任务?
最佳答案
你可以使用 Task.WhenAll为此目的的方法。或使用 TaskFactory.ContinueWhenAll然后您可以将控件编码到 UI 线程。
关于c# - 如何在最后一个任务完成后停止进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560982/