当最后一项任务完成时,如何停止进度条

本文关键字:何停止 完成时 任务 最后 一项 | 更新日期: 2023-09-27 18:29:53

我有一个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.WhenAll方法来实现此目的。或者使用TaskFactory.ContinueWhenAll,然后可以将控件编组到UI线程。

Parallel.WaitAll()放入另一个任务中。

您可以尝试启动另一个执行Task.WaitAll()并在之后通知UI的Task。

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