上次任务完成后如何停止进度条?

时间:2013-09-01 17:27:22

标签: c# multithreading task-parallel-library

我有一个更新缓慢加载项目的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。它有效,但感觉不像任务一样......

是否有以任务原生的方式来实现这一目标?

4 个答案:

答案 0 :(得分:2)

您可以使用Task.WhenAll方法来达到此目的。或使用TaskFactory.ContinueWhenAll,然后您可以将控件编组到UI线程。

答案 1 :(得分:0)

将您的Parallel.WaitAll()放入另一项任务

答案 2 :(得分:0)

您可以尝试触发另一个执行Task.WaitAll()的任务,并在之后通知您的用户界面。

答案 3 :(得分:0)

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