添加进度条
本文关键字:添加 | 更新日期: 2023-09-27 18:09:40
我有一个windows窗体应用程序,使用一个类(它的名字是Parser
)这个表单有一个按钮,当我点击Windows表单应用程序按钮时,它调用一个解析器类方法。
这个方法只是逐行读取文本文件,并将每一行写入单独的文件…
我想添加一个进度条的形式,以显示进度(这是一个非常大的文件)
你知道怎么做吗?在Parse类2属性中,第一个表示文件中的行数,第二个表示已经检查了多少行。
这是button2_Click
函数
private void button2_Click(object sender, EventArgs e)
{
if (this.textBox1 != null & this.textBox2 != null)
{
inst.init(this.textBox1.Text, this.textBox2.Text);
//this.progressBar1.Show();
inst.ParseTheFile();
System.Windows.Forms.MessageBox.Show("Parsing finish successfully");
}
}
你可以这样做:
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
var lines = File.ReadLines(@"D:'test.txt");
var count = lines.Count();
for(int i = 0; i < count; i++)
{
// some parse work
Invoke(new Action(() =>
{
progressBar1.Value = (i * 100) / count;
}));
}
});
}
在上面的例子中,它只是创建一个后台线程,以便不阻塞UI线程,直到Invoke
方法被调用。Invoke
方法是必要的,以便对当前线程不是所有者的Control
进行操作。它接受一个委托,并在拥有Control
的线程上运行这个委托。
如果解析行是一项耗时的任务,您甚至可以使foreach
循环并行。一个例子:
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
var lines = File.ReadLines(@"D:'test.txt");
var count = lines.Count();
Parallel.For(0, count, i =>
{
// some parse work
Invoke(new Action(() =>
{
progressBar1.Value = (i * 100) / count;
}));
});
});
}
通常你应该继续写一些你已经尝试过的东西。因为我认为你更多的是在"开始"方面,我建议你研究一下BackgroundWorker和它的ProgressChanged事件/系统(这里是它的介绍)。
当然你必须把你的ParseTheFile-code移到这里。
对于更高级的东西,有几个选项:
- 为
ParseTheFile
添加一个参数(例如Action),用于设置进度 - 从你的
ParseTheFile
返回一个IObservable来指示进程 - 使用
ParseTheFile
正在使用的一些静态服务来指示进度(不建议) - …(我相信其他人会找到更多的选择)
(请注意,大多数选项需要使用Control。调用返回到您的ui线程设置进度条值,如果您使用另一个线程-我会建议您使用另一个线程,如果文件是那么大)
对于初学者,我会使用后台工作人员-恕我直言,如果你不想在第一次运行时就使用SOLID(设计模式/原则),这很好;)
只需使用数学计算百分比如:
//While Reading
NumOfLines++;
int Percentage = (NumOfLines * 100) / TotalLines ;
ProgressBar.Value = Percentage;
可能会输入int.ParseTheFile();在后台工作线程和/或线程中。