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

问题描述 投票:-1回答:1

此程序将文件打开到文本框中。它可以处理大小为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();
        }
c# memory textbox streamreader
1个回答
2
投票
  1. 逐行读取文件会产生不必要的开销。最好一次读取所有文件。

  2. 考虑使用异步/等待。这将为您带来更灵敏的界面。

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

    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,它是为快速处理字符串数据而设计的。

© www.soinside.com 2019 - 2024. All rights reserved.