进度由〜25 [异步]
的因素减缓我的代码,我做了一些文件迭代,有我的测试方案在文件中的行(约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是懒惰去了。
尽量避免太多的更新用户界面,因为它会导致很多重绘的形式出现的。这是导致您的应用程序减速的重绘次数。
如果你的文件有很多线路,然后更新了大量的线条将重绘棒不动,它的进度条。例如,如果您的进度条宽度为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;
}
}
这是非常好的 - 我做了类似的另一个原因。我将进度条的最大值分配给*字符*的数量而不是行,并且需要使用long而不是int,所以我有一个比率变量,我每次去时都会保留并用于分割。更新。我放弃了这项技术,因为对于这么简单的任务来说这似乎太愚蠢了。 – AngelicCore
@mikelegg,贷款给你的代码示例 – DiskJunky
我编辑了错误的答案:) – mikelegg
多次更新进度栏没有多少意义。
将最大进展比例缩小为较小的范围,例如, 0-100,然后只有在缩放号码发生变化时才调用该更改。
'Invoke' =等待UI,然后运行代理,你可能只是想'BeginInvoke',又名火和忘记。 – Sinatr
@Sinatr问题的第二个最后一行:'我尝试过BeginInvoke,但运行时没有区别。“ – EpicKip
您可能想要考虑报告百分比进度。更新UI 130万次不太可能是一种非常有效的方法。 –