我有一个 BackgroundWorker 和一个 ProgressBar。工作时,BackgroundWorker 运行三重 for 循环并向 ProgressBar 报告进度。
目前,报告的进度仅是最外层循环 (xProgress) 的进度,该循环有效,但运行不流畅。目标是让 ProgressBar 也考虑到内循环的进度百分比,以便 ProgressBar 更新更平滑和更准确。
DoWork 方法:
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
int xMax, yMax, zMax;
xMax = 10;
for (int x = 1; x <= xMax; x++)
{
yMax = 5;
for (int y = 1; y <= yMax; y++)
{
zMax = new Random().Next(50, 100);
for (int z = 1; z <= zMax; z++)
{
Thread.Sleep(5); /// The process
double xProgress = (double)x / (double)xMax;
double yProgress = (double)y / (double)yMax;
double zProgress = (double)z / (double)zMax;
/// The progress calculation:
double progressCalc = xProgress;
int progress = (int)(progressCalc * pgb.Maximum);
bgw.ReportProgress(progress);
}
}
}
}
最佳答案
即使您事先不知道最好/最坏的情况,这仍然有效。
任何最大值都可以按照与 zMax
相同的方式随机化。
static void F()
{
var r = new Random();
int xMax = 10;
int yMax = 5;
int zMax;
for (int x = 0; x < xMax; x++)
{
double xProg = (double)x / xMax;
for (int y = 0; y < yMax; y++)
{
double yProg = (double)y / (yMax * xMax);
zMax = r.Next(50, 100);
for (int z = 0; z < zMax; z++)
{
double zProg = (double)z / (zMax * yMax * xMax);
var prog = xProg + yProg + zProg;
Console.WriteLine(prog.ToString("P"));
// bgw.ReportProgress((int)(prog * pgb.Maximum));
}
}
}
Console.WriteLine(1.ToString("P")); // Make sure to report the final 100%
// bgw.ReportProgress((int)pgb.Maximum);
}
顺便说一句,我会将 pgb.Maximum
替换为 1
并在 OnProgressHandler
中将进度乘以它。这样,线程方法根本不会触及 UI 元素。
关于c# - 如何根据嵌套循环中的多个变量报告进度(对于进度条)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41145200/