Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
随着多行文本框中字符串的增长,C#应用程序变得缓慢且无响应_C#_Performance_Timer_Textbox - Fatal编程技术网

随着多行文本框中字符串的增长,C#应用程序变得缓慢且无响应

随着多行文本框中字符串的增长,C#应用程序变得缓慢且无响应,c#,performance,timer,textbox,C#,Performance,Timer,Textbox,我有一个C#应用程序,其中许多信息被添加到文本框中,以显示给用户。处理数据后,应用程序几乎立即变得非常缓慢且无响应。这就是我目前试图处理此问题的方式: var saLines = textBox1.Lines; var saNewLines = saLines.Skip(50); textBox1.Lines = saNewLines.ToArray(); 此代码每100mS从计时器运行一次。有没有更好的方法来处理这个问题?我正在使用Microsoft Visual C#20

我有一个C#应用程序,其中许多信息被添加到文本框中,以显示给用户。处理数据后,应用程序几乎立即变得非常缓慢且无响应。这就是我目前试图处理此问题的方式:

   var saLines = textBox1.Lines;
   var saNewLines = saLines.Skip(50);
   textBox1.Lines = saNewLines.ToArray();

此代码每100mS从计时器运行一次。有没有更好的方法来处理这个问题?我正在使用Microsoft Visual C#2008快速版。谢谢。

尝试在内存中创建一个包含内容的列表,然后通过Removatange删除前50个元素,然后使用ToArray(); 像这样:

lst.RemoveRange(0,50);
textBox1.Lines = lst.ToArray();

它应该快得多。

我想说,您的主要问题是,您正在使用文本框作为文本的主存储。每次调用TextBox.Lines时,字符串都会在
Environment.NewLine
上拆分

试着扭转局面:

  • 将文本存储在
    新列表(maxLines)
  • 在AddLine方法中,检查文本缓冲区的长度,并使用
    (0,excessCount)
  • 通过调用
    String.Join(Environment.NewLine,textBuffer.ToArray())更新显示文本框

最后一个电话有点贵,但它应该能阻止你的慢下来。若要更快,您需要使用静态大小的字符串数组并将引用移动到自己周围。

修剪数组的最有效方法是创建所需大小的新数组,然后使用
array.Copy
复制旧数组的所需部分


我建议您维护一个包含所有行的
列表。
您应该使用
StringBuilder
来构建一个包含要查找的行的字符串,并将文本框的
Text
属性设置为
StringBuilder
的字符串。为了提高性能,请将StringBuilder的容量设置为字符串最终sie的合理猜测值。(或到
列表。跳过(…)。取(…)。求和(s=>s.Length)

如果您担心内存问题,可以通过调用来修剪
列表

只要你不要一次在文本框里放太多,这样做应该非常快。
列表
StringBuilder
的所有操作都可以在后台线程中完成,您可以将完成的字符串传递给UI线程


TextBox.Lines
属性只是连接使用StringBuilder提供给它的数组,因此使用它(并创建不必要的数组)没有任何意义。

简单的答案是
TextBox.AppendText()

一开始你会有更好的表现。
我测试了每20毫秒写一条500字符的消息,持续2分钟(使用BackgroundWorker),UI保持响应速度和CPU最少。当然,在某个时候,它会变得没有响应,但它已经足够满足我的需要了。

与其拆分文本然后重新连接,不如从第51行获取子字符串:

int i = textBox1.GetFirstCharIndexFromLine(50);
if (i > 0) textBox1.Text = textBox1.Text.Substring(i);

您能发布所显示信息的示例和代码吗?谢谢。几个月后,我通过在
backgroundWorker
中构建全局
StringBuilder
对象,然后在
backgroundWorkerReportProgress
backgroundWorkerRunWorkerCompleted
方法中使用
TextBox.AppendText()
实现了这一点。真不敢相信我不知道!我知道用其他方法做一定会慢一些,但是速度提高的很好!而文本框实际保持响应。