我正在编写一个程序,它应该替换或删除logfile.txt中的一些条目。 代码工作正常(至少对于小型LogFiles)。如果我使用大文件(例如27 MB),它会变得非常缓慢并且UI冻结。我不能点击任何东西。UI冻结和计算真的很慢
在按钮点击我执行此方法:
private string delete_Lines(string[] lines, string searchString)
{
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(searchString))
{
rtbLog.Text += "Deleting(row " + (i + 1) + "):\n" + lines[i] + "\n";
progressBar1.Value += 1;
if (cbDB == true)
{
while (is_next_line_block(lines, i) == true)
{
i++;
rtbLog.Text += lines[i] + "\n";
progressBar1.Value += 1;
}
}
}
else
{
res += lines[i]+"\n";
progressBar1.Value += 1;
}
}
tssLbl.Text = "Done!";
rtbLog.Text += "...Deleting finished\n";
return res;
}
行是日志文件我试图清理的阵列。每个条目都是单行。 tssLbl是一个通知标签,rtbLog是一个richTextBox,我跟踪哪一行正在删除。
is_next_line_block是另一种方法,它是检查下一行是我想要删除的块的一部分。这种方法的参数是整行数组和行位置。
private bool is_next_line_block(string[] lines, int curIndex)
{
if (curIndex < lines.Length-1)
{
if (lines[curIndex + 1].StartsWith(" "))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
有没有人有任何想法,是什么导致冻结,并在减慢程序?我知道,我可以通过并行化来加速我的代码,但我无法想象,检查没有并行性的27 MB txt文件需要很长时间。
'BackgroundWorker' _does_使用线程,它专门设计用于允许进度更新到用户界面。如果你无法解决这个问题,请专门提出一个问题。至于性能,使用其他线程模型不会改变性能。如果处理27MB需要很长时间,那么该文件是最慢的磁盘,或者处理速度太慢。无论如何,你需要将这个例子缩小到更简单一些,一次只关注一个问题。请参阅http://stackoverflow.com/help/mcve和http://stackoverflow.com/help/how-to-ask – 2014-12-04 04:02:09
认真考虑将代码移到单独的类中,并且对该类的调用需要相应的参数你现在怎么做。现在将这个类实例化并通过Task.Factory调用它。开始()'并告诉我它是否仍在放慢你的应用程序。如果您需要设置/取消设置视觉线索(例如进度条等),请记得添加一个'.ContinueWith'。 – code4life 2014-12-04 04:07:21
@PeterDuniho我编辑我的问题和代码块,所以它可以更好地阅读。 ty的建议。 at code4life:可以肯定的是,我的理解正确: 您希望我将整个代码(期望从ui中获得的部分)移动到一个新类中并在那里进行计算?说实话,我不知道你的意思是什么Task.Factory.Start()和究竟是什么.ContinueWith? – Depa 2014-12-04 04:19:44