通过ProgressBar从任务列表中显示进度值

时间:2012-08-14 07:38:40

标签: c# winforms progress-bar

我的标题可能会让我的问题听起来很混乱,但事实并非如此。

我有一个要执行的任务列表和一个ProgressBar。当我遍历任务列表时,我想通过ProgressBar

显示进度
        double percentage;
        for(int i = 0; i < tasks.Count; i++)
        {
            percentage = (double)i + 1 / (double)tasks.Count;
            this.Invoke((MethodInvoker)delegate
            {
                progressBar1.Value = (int)Math.Round(percentage * 100);
            });
            // Do tasks here...
        }

所以,如果我说,我希望progressBar1的20个任务的值为((1 / 20) * 100),那么当它再次循环时,它的值为10,15,依此类推。我现在使用的方法无法正常工作,第一个任务progressBar1的值为0,然后当它再次循环时它的值为100.有没有办法做我自己的事情试图实现?

感谢。

2 个答案:

答案 0 :(得分:4)

for(int i = 0; i < tasks.Count; i++)
{
    double percentage = (double)(i + 1) / (double)tasks.Count;
    Action<double> update = p => 
    {
        progressBar1.Value = (int)Math.Round(p * 100);
    };
    this.Invoke(update, percentage);
    // Do tasks here...
}

答案 1 :(得分:0)

您的代码本质上应该可以工作,但我猜您的UI无法及时更新(即没有上下文切换发生,只有在您完成后才返回控制)。我没有那么多涉及C#,多线程和UI编码的经验,所以我可能有点偏离这里。

一旦你开始在任务线程中完成任务,我在这里尝试做的就是休息片刻(甚至基本上0秒应该可以做到这一点)。

有点偏离主题:我想提一下你有点过于复杂。只需将进度条的最大值设置为任务数,然后将其值增加1,这将在该循环中删除相当多的过时数学。

编辑:是的,只是注意到达林的答案而他是对的:你也错过了括号,导致你的百分比计算错误。

但请记住,这样做可能会导致您的总百分比因精确错误而略微偏离(根据任务数量而言并不重要;但您可能无法完全达到100%)