我有一个应用程序可以读取文件标题,我想要实现一个进度条,但我在尝试根据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可能更有益。
答案 0 :(得分:0)
进度条在UI线程上运行。更新进度条后,UI线程必须从您的代码返回并继续处理Windows消息,以便允许窗口重新绘制。
如果您的代码在繁忙循环中运行,则在循环完成并将控制权返回到主应用程序循环之前,不能处理任何进度更新。因此,在启动线程之后,您需要确保事件处理程序返回控制权,而不是坐着等待或做其他工作。
您需要在计时器上使用定期更新,或者(更好)在后台线程中运行您的处理,并且只是定期将进度更新传递回UI线程。但是,如果你只是从另一个线程中激活ui控件,你将得到一个交叉线程的人和未定义的结果。
大多数进度条示例应该向您展示如何使用BackgroundWorker或类似方法来执行后者。