进度条查询 - 最大变化

时间:2014-09-22 15:52:37

标签: c# winforms

我有一个应用程序可以读取文件标题,我想要实现一个进度条,但我在尝试根据this Microsoft example开始工作时遇到问题。

该示例可以处理复制的文件。

我喜欢使用每个文件进行操作的条形图,我的代码如下所示,只要读取了所有文件,它就会转到最大值。我打开以读取文件头的文件夹可以有1个文件或1000个。

我迷失了这个位,加上我可能会把代码放在错误的位置......

if (CopyFile(files[x-1]) == true)

我不认为我的线程也运作良好,因此对它的一些建议也会很棒。

private void btnOpenFile_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            ThreadStart t = delegate {};
            listBoxResults.Items.Clear();
            string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
            txtFilesFound.Text = files.Length.ToString();
            {
                string path = folderBrowserDialog1.SelectedPath;
                foreach (string filepath in Directory.GetFiles(path, comboFileType.Text, SearchOption.TopDirectoryOnly))
                {

                    foreach (string item in GetHeaderInformation(filepath))
                    {

                        this.Invoke(new Action(() => txtUpdate(item)));
                        // Display the ProgressBar control.
                        pBar1.Visible = true;
                        // Set Minimum to 1 to represent the first file being copied.
                        pBar1.Minimum = 1;
                        // Set Maximum to the total number of files to read.
                        pBar1.Maximum = files.Length;
                        // Set the initial value of the ProgressBar.
                        pBar1.Value = 1;
                        // Set the Step property to a value of 1 to represent each file being read.
                        pBar1.Step = 1;
                    }
                    this.Invoke(new Action(() => txtUpdate(filepath + Environment.NewLine)));
                    this.Invoke(new Action(() => txtUpdate("***************************************************************************")));
                    for (int x = 1; x <= files.Length; x++)
                       //if(CopyFile(files[x-1]) == true)
                            //{
                            // Perform the increment on the ProgressBar.
                                pBar1.PerformStep();
                            //}
                }
            };
            new Thread(t).Start();
        }
    }

任何帮助都将不胜感激。

也许this example可能更有益。

1 个答案:

答案 0 :(得分:0)

进度条在UI线程上运行。更新进度条后,UI线程必须从您的代码返回并继续处理Windows消息,以便允许窗口重新绘制。

如果您的代码在繁忙循环中运行,则在循环完成并将控制权返回到主应用程序循环之前,不能处理任何进度更新。因此,在启动线程之后,您需要确保事件处理程序返回控制权,而不是坐着等待或做其他工作。

您需要在计时器上使用定期更新,或者(更好)在后台线程中运行您的处理,并且只是定期将进度更新传递回UI线程。但是,如果你只是从另一个线程中激活ui控件,你将得到一个交叉线程的人和未定义的结果。

大多数进度条示例应该向您展示如何使用BackgroundWorker或类似方法来执行后者。