我的标题可能会让我的问题听起来很混乱,但事实并非如此。
我有一个要执行的任务列表和一个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.有没有办法做我自己的事情试图实现?
感谢。
答案 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%)