如何基于嵌套循环中的多个变量报告进度(对于进度条)?

Dom*_*per 6 c# math logic backgroundworker progress-bar

我有一个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);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Sim*_*Var 4

即使您事先不知道最好/最坏的情况,这也有效。任何最大值都可以以与 相同的方式随机化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);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我会将 ' pgb.Maximums 替换为 's1并乘以OnProgressHandler进度。这样,线程方法就根本不会触及 UI 元素。