【发布时间】:2017-10-12 13:06:31
【问题描述】:
我正在做一些文件迭代,并且我的测试场景有一个最大值 = 文件中的行数(大约 130 万)的进度条。
在使用进度条之前,文件的这个迭代(逐行)大约需要 2 秒
使用进度条并为每行增加一次后,大约需要 50 秒。
我的调用如下[MVP - Views - 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 - 运行时是相同的,但它似乎更顺畅。
你们是对的 - 当我想到它时,我不知道为什么我选择 Max value 是行数并为每个调用执行 1 PerformStep() ..可能是懒惰。
【问题讨论】:
-
Invoke= 等待 UI 然后运行委托,你可能只想要BeginInvoke,也就是一劳永逸。 -
@Sinatr 问题倒数第二行:
I've tried with BeginInvoke but there was no difference in runtime. -
您可能需要考虑报告百分比进度。将 UI 更新 130 万次可能不是一种非常有效的方法。
-
除了下面的好答案,如果您必须使用invoke,请改用
BeginInvoke。Invoke会导致线程死锁。加上Invoke阻塞了有点失败的工作线程
标签: c# winforms performance progress-bar