2017-10-12 81 views
2

的因素减缓我的代码,我做了一些文件迭代,有我的测试方案在文件中的行(约1.3万美元)的最大值=号的进度。进度由〜25 [异步]

使用进度条此迭代的文件(逐行)的需要大约2秒

使用进度条后并且对于每个大约需要50秒线一次递增它之前。

我的电话如下[MVP - 视图 - 的WinForms]

在主讲人:

return Task.Run(() => 
      { 
       using (var reader = File.OpenText(FileName)) 
       { 
        while (!reader.EndOfStream) 
        { 
         var currentLine = reader.ReadLine(); 
         _splitterFormView.PerformStep(1); 
         if (currentLine.ToUpper().Contains("BLA")) 
         ... 
        } 
       } 
      }); 

形式:

void PerformStep(int stepValue) 
{ 
    Invoke(new Action(() => { progressBarStatus.Increment(stepValue); })); 
} 

我试着BeginInvoke的,但没有运行时差异。

我做错了吗?

编辑:正如我所说,我已经试过的BeginInvoke - 运行时是相同的,但它似乎走得更顺畅。

你们是正确的 - 当我想起它,我不知道为什么我有最大价值是行数,做1 PerformStep()为每call..might是懒惰去了。

+0

'Invoke' =等待UI,然后运行代理,你可能只是想'BeginInvoke',又名火和忘记。 – Sinatr

+1

@Sinatr问题的第二个最后一行:'我尝试过BeginInvoke,但运行时没有区别。“ – EpicKip

+0

您可能想要考虑报告百分比进度。更新UI 130万次不太可能是一种非常有效的方法。 –

回答

3

尽量避免太多的更新用户界面,因为它会导致很多重绘的形式出现的。这是导致您的应用程序减速的重绘次数。

如果你的文件有很多线路,然后更新了大量的线条将重绘棒不动,它的进度条。例如,如果您的进度条宽度为400像素,但您要更新10,000次,那么很多重画都是不必要的。

例如,一些有点像这样:

float _previousValue; 

void PerformStep(int stepValue, int maximumValue) 
{ 
    var scaledValue = (float)stepValue/(float)maximumValue * 100.0F; 
    if (scaledValue != _previousValue) 
    { 
     BeginInvoke(new Action(() => { progressBarStatus.Increment(stepValue); })); 
     _previousValue = scaledValue; 
    } 
} 
+1

这是非常好的 - 我做了类似的另一个原因。我将进度条的最大值分配给*字符*的数量而不是行,并且需要使用long而不是int,所以我有一个比率变量,我每次去时都会保留并用于分割。更新。我放弃了这项技术,因为对于这么简单的任务来说这似乎太愚蠢了。 – AngelicCore

+2

@mikelegg,贷款给你的代码示例 – DiskJunky

+1

我编辑了错误的答案:) – mikelegg

3

多次更新进度栏没有多少意义。

将最大进展比例缩小为较小的范围,例如, 0-100,然后只有在缩放号码发生变化时才调用该更改。