0

我的标题可能会使我的问题听起来令人困惑,但事实并非如此。

我有一个要完成的任务列表和一个ProgressBar. 当我遍历任务列表时,我想通过 a 显示进度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...
        }

因此,如果我说 20 个任务progressBar1的值是 5 ((1 / 20) * 100),那么当它再次循环时,它的值是 10、15 等等。我现在使用的方法不能正常工作,第一个任务progressBar1的值为 0,然后当它再次循环时,它的值为 100。有没有办法做我想要实现的目标?

谢谢。

4

2 回答 2

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...
}
于 2012-08-14T07:46:55.357 回答
0

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

一旦您开始在任务线程中执行任务,我在这里尝试做的是睡一会儿(即使基本上 0 秒也应该可以解决问题)。

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

编辑:是的,刚刚注意到达林的回答,他是对的:你也缺少括号,导致你的百分比计算出错。

但请记住,这样做可能会由于精度错误而导致您的总百分比略有下降(取决于任务数量,这并不重要;但您可能无法准确达到 100%)。

于 2012-08-14T07:47:01.823 回答