【发布时间】:2015-02-01 20:36:43
【问题描述】:
我正在编写一个程序,它应该替换或删除 logfile.txt 中的一些条目。 该代码运行良好(至少对于小型日志文件)。如果我使用一个大文件(如 27 MB),它会变得非常慢并且 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;
}
Lines 是我要清理的日志文件的数组。每个条目都是一行。 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确实使用线程,它专门设计用于允许对 UI 进行进度更新。如果您无法弄清楚这一点,请专门提出一个问题。至于性能,使用其他一些线程模型不会改变性能。如果处理 27MB 需要很长时间,那么要么该文件位于有史以来最慢的磁盘上,要么您的处理速度太慢。无论如何,您需要将此示例缩小到更简单的范围,并一次只关注一个问题。见stackoverflow.com/help/mcve 和stackoverflow.com/help/how-to-ask -
认真考虑将代码移动到一个单独的类并调用该类需要适当的参数,而不是你现在的做法。现在实例化这个类并通过
Task.Factory.Start()调用它,并告诉我它是否仍在拖慢您的应用程序。如果您需要设置/取消设置视觉提示(例如进度条等),请记得添加.ContinueWith。 -
@PeterDuniho 我编辑了我的问题和代码块,以便更好地阅读。 ty 的建议。在code4life:只是为了确定,我理解你正确:你想让我将我的整个代码(期望来自ui的部分)移动到一个新类并在那里进行我的计算?老实说,我不知道您所说的 Task.Factory.Start() 是什么意思,.ContinueWith 到底是什么意思?
-
鉴于您的编辑,您的具体问题是什么?询问“有什么想法或建议吗?”至少可以说有点宽泛和模糊。还请返回并重新阅读我在第一条评论中提供的链接。
-
我已经在简介中写下了我的问题,但我再次编辑了这个帖子,也许它现在已经足够清楚了。我还阅读了您发布的链接。
标签: c# multithreading user-interface freeze