添加到文本框的大字符串冻结了我的程序

Large strings added to a text box freezing my program

此程序将文件打开到文本框中。它适用于大小为 4KB 的小文件,但我无法处理 200KB 的文件。理想情况下,我希望能够打开任何大小的文件,但将大文件打开到文本框中会冻结程序。我做错了什么?

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                StreamReader sr = new StreamReader(openFileDialog1.FileName);
                Text = openFileDialog1.FileName + " - " + "Fixprt";
                textBox1.Text = String.Empty;

                while (!sr.EndOfStream)
                {
                    textBox1.Text += sr.ReadLine() + Environment.NewLine;
                }
                sr.Close();
            }
            openFileDialog1.Dispose();
        }
  1. 逐行读取文件会产生不必要的开销。最好一次读取所有文件。

  2. 考虑使用 async/await。这将为您带来更灵敏的界面。

所以我建议下一个解决方案:

    private async void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            StreamReader sr = new StreamReader(openFileDialog1.FileName);
            Text = openFileDialog1.FileName + " - " + "Fixprt";

            textBox1.Text = await sr.ReadToEndAsync();

            sr.Close();
        }
        openFileDialog1.Dispose();
    }

编辑

如评论中所述,此解决方案无法正确处理 unix 风格的换行符。对于这种情况,它可以是其他决定:

   private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            StreamReader sr = new StreamReader(openFileDialog1.FileName);
            Text = openFileDialog1.FileName + " - " + "Fixprt";

            var sb = new StringBuilder();
            while (!sr.EndOfStream)
            {
                sb.AppendLine(sr.ReadLine());
            }
            textBox1.Text = sb.ToString();

            sr.Close();
        }
        openFileDialog1.Dispose();
    }

现在我们使用的是StringBuilder,它专为快速处理字符串数据而设计。