我可以并行使用进度条吗? (每个线程读取不同的文件)

时间:2015-03-04 14:49:05

标签: c# multithreading parallel-processing streamreader binaryreader

我必须处理10个二进制文件,每个文件大于100MB。 我使用BinaryReader编写了一个单线程程序,并且运行良好。 我想通过使用

使其并行
Parallel.For(0,10, i=>
{
  -------------
  BinaryReader BR = new BinaryReader(File.Open(Files[i], FileMode.Open));
  While (BR.BaseStream.Position < BR.BaseStream.Length)
  { 
      Uint64 a = BR.ReadUInt64(); 
      ProgressBar[i].Value = Convert.ToInt32( 10* BR.BaseStream.Position / BR.BaseStream.Length); //error
  }
  -------------
} );

enter image description here 更新进度条(由UI线程拥有)是问题所在 每个线程都有自己的进度条控件实例,但是它们无法触及它。

1 个答案:

答案 0 :(得分:0)

您无法从主UI线程之外的其他线程访问表单上的控件元素。你需要调用&#39;完成这项工作的功能。从UI线程&#39; 以外的地方搜索&#39;更新控件。

另外,我建议使用BackgroundWorkers,因为它们是一个专用函数,用于向控制表单的主UI线程报告进度:
https://msdn.microsoft.com/de-de/library/a3zbdb1t(v=vs.110).aspx

您传递给此功能的数据取决于您。

但是还有一件事需要考虑:你是从硬盘驱动器读取10倍100MB吗?如果是,那么你应该保持操作顺序!!否则硬盘将成为瓶颈并将其全部降低而不是加速,因为读/写头在文件之间跳转时的定位时间。 从RAM(RAM磁盘)或SSD读取文件时,此问题不存在。