Большие строки добавлены в текстовое поле, замораживающее мою программу - PullRequest
0 голосов
/ 20 марта 2020

Эта программа открывает файлы в текстовое поле. Он отлично работает с небольшими файлами, такими как 4 КБ, но у меня проблемы с файлом 200 КБ. В идеале я хочу иметь возможность открывать файлы любого размера, но открытие больших файлов в текстовое поле останавливает программу. Что я делаю не так?

        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 Ответ

1 голос
/ 20 марта 2020
  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 , который предназначен для быстрой обработки строковых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...