c# - 如何在最后一个任务完成后停止进度条?

标签 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() 开头的计数器,然后是 /* 如果是什么? */ 变为 --itemsToUpdate== 0。它有效,但感觉不太像任务......

是否有 Tasks 原生方法来完成此任务?

最佳答案

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

关于c# - 如何在最后一个任务完成后停止进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560982/

相关文章:

c# - 如何通过Escape键正确取消并行异步IO任务?

c# - 使用异步和等待

c# - 异步下载文件到客户端

c# - 将 IN 运算符与存储过程参数一起使用

c# - 先EF数据库,重命名实体表名

java - 如果在 sleep 线程上调用interrupt()会发生什么?

java - 为什么在独立代码之后执行Java Thread?

multithreading - 我可以定义一个特征,其实现必须是 `!Send` 吗?

c# - 任务完成源 : When to use SetResult() versus TrySetResult(), 等

c# - WPF 的快捷键