2011-09-25 143 views
1

我有一个窗体应用程序使用一个类(它的名字是Parser) 这个窗体有一个按钮,当我点击窗体窗体应用程序按钮时,它调用一个解析器类的方法。添加进度条

行之后

这种方法只是简单的阅读文本文件的行,写每一行分开的文件...

我想一个进度条,以显示进度添加到窗体(这是一个非常大的文件)

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

你应该命名你的控件。 – SLaks

回答

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

在上面的例子中,它只是简单地创建,以不阻塞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; 
      })); 
     }); 
    }); 
} 
+0

此代码将冻结用户界面。 –

+0

@HansPassant,怎么回事?所有代码都在后台线程上执行。它不会阻止UI线程。 – ebb

+0

它用调用请求来泛滥UI线程,它不会执行其常规的低优先级职责了。像绘画一样。 –

1

normaly你应该去和你媒体链接尝试写一些。 因为我觉得你越来越对* begining”身边,我会建议寻找到BackgroundWorker及其ProgressChanged事件/系统(这里是一个intro它)。

当然,你必须将你的ParseTheFile码成这

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

  • 一个参数添加到ParseTheFile(例如Action),用于设置进度
  • 回报IObservableParseTheFile指示进度
  • 使用一些静态服务ParseTheFile使用表示进度(不劝)
  • ...(我敢肯定,其他永世会发现很多更多的选择)

(请注意,如果您使用另一个线程,大多数此选项都需要使用Control.Invoke返回您的UI-Thread以设置进度条值 - 如果文件很大,我会建议您使用另一个线程)

对于初学者我会去与backgro undworker - 恕我直言,这是罚款,如果你不想在你第一次运行去固体(德兴模式/坚持的原则);)

0

只是用数学来计算百分比 像:

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

而且很可能把INT .ParseTheFile();到后台工作者和/或线程内。