添加进度条

时间:2011-09-25 14:42:18

标签: c# progress-bar

我有一个使用一个类的Windows窗体应用程序(其名称为Parser) 这个表单有一个按钮,当我点击windows窗体应用程序按钮时,它会调用一个解析器类方法。

此方法只需逐行读取文本文件并将每行写入单独的文件...

我想在表单中添加一个进度条以显示进度(这是一个非常大的文件)

任何想法怎么做?我在Parse class 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"); 
       }
}

3 个答案:

答案 0 :(得分:2)

你可以这样做:

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;
            }));
        }
    });
}

在上面的示例中,它只是创建一个后台线程,以便在调用Invoke方法之前不阻止UI线程。 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;
            }));
        });
    });
}

答案 1 :(得分:1)

你应该继续写一些你已经尝试过的东西。 由于我认为你更喜欢“开始”,我建议你查看BackgroundWorker及其ProgressChanged事件/系统(这里是intro)。

当然你必须把你的ParseTheFile代码移到这里。

对于更高级的东西,有几个选项:

  • 将参数添加到用于设置进度的ParseTheFile(例如Action
  • ParseTheFile返回IObservable表示进度的Control.Invoke
  • 使用一些静态服务ParseTheFile用来表示进度(不建议)
  • ...(我相信其他人会发现更多选择)

(请注意,大多数此选项需要使用{{3}}返回UI-Thread以设置进度条值,如果您使用另一个线程 - 我建议您使用另一个线程,如果文件是那么大)

对于初学者,我会选择背景工作者 - 恕我直言,如果您不想在第一次运行时使用SOLID(desing patterns / priciples),这很好;)

答案 2 :(得分:0)

只需使用Math来计算百分比 喜欢:

//While Reading
NumOfLines++;
int Percentage = (NumOfLines * 100) / TotalLines ;
ProgressBar.Value = Percentage;

并且可能放入int.ParseTheFile();进入后台工作者和/或线程内。