添加进度条

本文关键字:添加 | 更新日期: 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();在后台工作线程和/或线程中。