当最后一个任务完成时,我该如何停止进度条?

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。它可以工作,但感觉不太像Task...
有没有一种Tasks本地的方法来完成这个任务?

当您开始一个任务时,只需递增计数器,完成后递减即可。当计数器达到0时,PB应该消失。 - Hans Passant
你可以像@HansPassant建议的那样使用解决方法,但请记住你的任务在不同的线程中运行。 - Hamlet Hakobyan
不,计数保证在同一线程上运行。如果不是这样,更新 PB 也无法工作。 - Hans Passant
我会使用类似下面链接中 @Alex Filipovici 的解决方案:Alex Filipovici。这使得该任务类似于异步/等待模式。 - Bassam Alugili
4个回答

2

0
将你的Parallel.WaitAll()放在另一个任务中。

0
你可以尝试启动另一个任务,执行Task.WaitAll()并在完成后通知你的UI。

0
  1. 创建父任务。
  2. 将所有任务附加到父任务。
  3. 在父任务的继续中隐藏进度条。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接