0

朋友们,这是我的代码(如下)。我无法弄清楚为什么值的变化没有反映在进度条上。

    void Code()
    {
        string key;
        for (int i = 0; i < 26; i++)
            for (int j = 0; j < 10; j++)
                for (int k = 0; k < 26; k++)
                    for (int l = 0; l < 10; l++)
                        for (int m = 0; m < 26; m++)
                        {
                            key = (char)(65 + i) + " " + j.ToString() + " " + (char)(65 + k) + " " + l.ToString() + " " + (char)(65 + m);
                            File.AppendAllText("D:\\Codes.txt", key + Environment.NewLine);
                            val = (i + 1) * (j + 1) * (k + 1) * (l + 1) * (m + 1);
                            MyProgressBar.Value = val;
                            MyProgressBar.Text = (val * 100 / 1757600).ToString() + "%";
                            if (val == 1757600)                                                                    
                                MessageBox.Show("Code generation completed");
                        }
    }

进度条的值和文本属性与加载时相同。请帮我解决这个问题。提前感谢您的宝贵意见。. .

4

3 回答 3

1

您的代码阻塞了 UI 线程,这就是它不更新的原因。您需要使用某种类型的后台线程来触发通知 UI 线程进行更新的事件。谷歌“后台处理c#”了解一些细节。

于 2012-11-14T07:02:58.190 回答
1

如果您为每个值更改更新它,它仍然会阻止 UI。而这个 File.AppendAllText 是你的代码中最慢的部分。如果我将它注释掉,它会在几秒钟内运行到最后。你想尝试将所有代码保存到一个数组中,然后将它们全部打印在一度?我想这会快一点。

                    string[] key = new string[1757600];

            private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
            {
                int val = 0;
                for (int i = 0; i < 26; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        for (int k = 0; k < 26; k++)
                        {
                            for (int l = 0; l < 10; l++)
                            {
                                for (int m = 0; m < 26; m++)
                                {
                                    key[val] = (char) (65 + i) + " " + j.ToString() + " " + (char) (65 + k) + " " + l.ToString() + " " +
                                          (char) (65 + m);
                                    //File.AppendAllText("D:\\Codes.txt", key + Environment.NewLine);
                                    //val = (i + 1)*(j + 1)*(k + 1)*(l + 1)*(m + 1);
                                    val++;
                                }
                            }
                    backgroundWorker3.ReportProgress(val);
                        }
                    }
                }
            }

            private void backgroundWorker3_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                MyProgressBar.Value = e.ProgressPercentage;
                MyProgressBar.Text = e.ProgressPercentage.ToString() + "%";
                //if (e.ProgressPercentage == 1757600)
            }

            private void backgroundWorker3_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                File.WriteAllLines("D:\\Codes.txt", key);
                MessageBox.Show("Code generation completed");
            }

这段代码只需要几秒钟;)

于 2012-11-14T08:36:46.923 回答
0

ProgressBar 的取值范围为 0 到 100

MyProgressBar.Value = (val * 100 / 1757600);
于 2012-11-14T07:05:31.910 回答