C# 估计进度条的循环时间

C# 估计进度条的循环时间,c#,loops,progress-bar,C#,Loops,Progress Bar,我目前正在使用C#中的一个循环来生成文件,但程序实际上需要几秒钟的时间来完成这项工作,我觉得程序用户将受益于一个进度条,该进度条会更新,告诉他们循环完成了多远,这样他们就可以估计循环何时完成,以及他们所有的文件何时生成 我想知道是否有一种方法可以计算循环完成所需的时间,或者用循环更新进度条以显示循环还剩多少进度 这是我的循环 String GeneratedLevelName; int levelx = 0; int levely = 0; for (int i = 0; i < Gma

我目前正在使用C#中的一个循环来生成文件,但程序实际上需要几秒钟的时间来完成这项工作,我觉得程序用户将受益于一个进度条,该进度条会更新,告诉他们循环完成了多远,这样他们就可以估计循环何时完成,以及他们所有的文件何时生成

我想知道是否有一种方法可以计算循环完成所需的时间,或者用循环更新进度条以显示循环还剩多少进度

这是我的循环

String GeneratedLevelName;
int levelx = 0;
int levely = 0;

for (int i = 0; i < GmapLevelArea; i ++) {
  if (levelx >= (GmapWidth - 1)) {
    levelx = 0;
    levely ++;

    GeneratedLevelName = (GmapPrefix + "_" + levelx + "_" + levely + ".nw");
    File.Copy(ApplicationDirectory + TemplateFileName, GmapDirectory + GeneratedLevelName);
    GmapFile.AppendLine('"' + GeneratedLevelName + '"' + ",");
  } else {
    levelx ++;

    GeneratedLevelName = (GmapPrefix + "_" + levelx + "_" + levely + ".nw");
    File.Copy(ApplicationDirectory + TemplateFileName, GmapDirectory + GeneratedLevelName);
    GmapFile.Append('"' + GeneratedLevelName + '"' + ",");
  }
}
字符串生成的levelname;
int levelx=0;
int-levely=0;
对于(int i=0;i=(GmapWidth-1)){
levelx=0;
levely++;
GeneratedLevelName=(GmapPrefix+“”+levelx+“”+levely+”.nw”);
Copy(ApplicationDirectory+TemplateFileName,GmapDirectory+GeneratedLevelName);
GmapFile.AppendLine(“”+GeneratedLevelName+“+”,”);
}否则{
levelx++;
GeneratedLevelName=(GmapPrefix+“”+levelx+“”+levely+”.nw”);
Copy(ApplicationDirectory+TemplateFileName,GmapDirectory+GeneratedLevelName);
附加(““+GeneratedLevelName+”“+”,”);
}
}

非常感谢您提供的任何帮助。

这取决于生成的文件的一致性(它们都需要一秒钟的时间,还是需要比其他文件更长的时间?)以及您是否知道要生成多少文件。在最简单的情况下,您可以通过获取要生成的文件数来估计时间。例如,如果您创建了50个文件,您可以在生成文件后将进度条增加2%。

因为很难对文件计时。复制,我认为您应该将进度条基于所处理的所有文件

所以如果你有一个进度条:pb

pb.Minimum = 0;
pb.Maximum = GMapLevelArea;
然后将进度条的值设置为i值

pb.Value = i;
现在,当我通常使用这样的进度条时,我通常不会更新任何迭代。我通常在几次迭代后更新

为此,我通常检查迭代计数:

if(i % 10 == 0) //only true when i is a multiple of 10
 pb.Value = i;
然后在循环结束时,如果它不是您更新的倍数,您可以将进度条设置为其最大值,或者将其重置为零,让它们不执行更新

pb.Value = GMapLevelArea; or pb.Value = 0;

您必须手动计算的时间。当然有可能。您还可以只显示所取得的进展(比如每次迭代都会触发事件)。如果每次迭代的时间大致相等,后者就足够了,这实际上是一个很好的替代建议。不过,我会研究手动计算时间。谢谢你的帮助。如果你的文件足够大,你想得到一个复制字节的进度条,看看这些问题:这个链接没有帮助:这些是我最初的想法。我可以利用常识做出合理的估计,每次生成文件时都增加进度条。不过,我能看到的唯一问题是,不同的计算机会发现生成文件更容易/更难,而且速度也不同。较慢的计算机可能需要一分钟,而较快的计算机可能需要几秒钟。这仍然不会改变迭代的进度。如果生成10个文件,则在快速和慢速计算机上的百分比相同。唯一的区别是进度条增加的速度有多快。只有当你想估计手术剩下的时间时,速度才重要,在这种情况下,你可以看看这里:这正是我想要的。你提供的解决方案现在看来很明显!非常感谢你。