2011-11-19 85 views
1

我有一个winform在第二个线程中读取一个csv文件并将文件数据写入控制台。主窗体有一个进度条。我希望根据第二个线程中读取的数据行更新主窗体上的进度条。在我使用的第二个线程函数中:C#跨线程调用来更新进度条

pBar.BeginInvoke((MethodInvoker)delegate 
{ 
    this.pBar.Value = (int) (((double) nRows)/((double) fileLines)); 
}); 

不用说这似乎不起作用。任何建议将不胜感激。另外,我应该在第二个线程中使用pBar.Show()和pBar.Hide()或设置pBar.Visible来显示/隐藏进度条吗?

谢谢。

+0

呃,你怎么知道文件中的行数?这通常是鸡与鸡蛋的问题。 –

+0

我使用:int fileLines = System.IO.File.ReadAllLines(fd.FileName).Length; – Zeos6

+0

因此,你阅读文件的全部内容,然后在重新阅读它们之前将它们扔掉?! –

回答

1

你可能只是缺少100乘法转换为百分比:

this.pBar.Value = 100*nRows/fileLines; 

假设nRows0fileLines那么你的代码将始终设置进度条价值01之间取值。


我应该使用pBar.Show()pBar.Hide()或设置pBar.Visible在第二个线程显示/隐藏进度条?

无论你在第二个线程中做什么,都不应该调用GUI控件的方法。使用BeginInvokeInvoke编组到GUI线程。

+0

我抓住并修复了100乘数,并没有什么区别。关于第二点,我不确定我明白你在说什么。 – Zeos6

+0

那么,除此之外,我看不出任何错误。你还没有说过你的程序如何失败。如何一些更多的细节。 –

+0

另外,你可以尝试使用内置的进度条。也许你的习惯被画了一个坏了。 –