2013-09-01 22 views
3

我有一个更新缓慢加载项目的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

只需增加一个计数器,当你开始一个任务,减少它完成后。当它达到0时,PB应该消失。 –

+0

您可以像建议@HansPassant一样使用解决方法,但请记住您的任务运行在不同的线程中。 –

+0

不,计数保证在同一个线程上运行。如果没有,那么更新PB也无法工作。 –

回答

0

把你的Parallel.WaitAll()还有另一个任务

0

你可以尝试发射了另一项任务,做Task.WaitAll()和后通知您的UI。

0
  1. 创建父任务。
  2. 附上所有任务父。
  3. 在父延续隐藏进度条。
相关问题