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. 它有效,但感觉不是很像任务......

有没有一种任务原生的方式来完成这个?

4

4 回答 4

2

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

于 2013-09-01T17:32:38.047 回答
0

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

于 2013-09-01T17:31:42.260 回答
0

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

于 2013-09-01T17:33:29.800 回答
0
  1. 创建父任务。
  2. 将所有任务附加到父级。
  3. 在父继续隐藏进度条。
于 2013-09-01T17:38:05.337 回答