C# 当最后一个任务完成时,如何停止进度条?
我有一个UI程序,可以更新缓慢加载的项目。我设法让项目并行加载,并在加载完成后立即显示每个项目。但是,我希望在加载时显示进度条,并在加载所有项目后将其隐藏C# 当最后一个任务完成时,如何停止进度条?,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,我有一个UI程序,可以更新缓慢加载的项目。我设法让项目并行加载,并在加载完成后立即显示每个项目。但是,我希望在加载时显示进度条,并在加载所有项目后将其隐藏 private void refreshButton_Click(object sender, EventArgs e) { foreach (var item in Items) { progressBar1.Visible = true; Task.Factory .
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
。这很有效,但感觉不太像
是否有一种任务本机方式来完成此任务?将您的Parallel.WaitAll()
放在另一个任务中。您可以使用此方法。或者使用,然后您可以将控件整理到UI线程。您可以尝试启动另一个执行Task.WaitAll()的任务,并在之后通知您的UI
创建父任务
将所有任务附加到父任务
在父延续中隐藏进度条
当你开始一项任务时,只需增加一个计数器,当它完成时,减少它。当它达到0时,PB应该消失。您可以使用@HansPassant建议的变通方法,但请记住,您的任务在不同的线程中运行。不,计数保证在同一线程上运行。如果没有,那么更新PB也无法工作。我会在下面的链接中使用类似于@Alex Filipovici soultion的东西:[Alex Filipovici](),这使任务类似于异步\等待模式。