Многопоточность C#. Вывод в TextBox

545
19 мая 2018, 12:50

Имеется файл, где большое количество строк. Вывод файла осущствляется построчно циклом. Но из-за того, что файл большой, действие идет больше 60 сек и вызывается исключение. Как решить эту проблему?

 StreamReader file = new StreamReader("buffer2.txt");
                string line = file.ReadLine();
                while (line != null)
                {
                    textBox3.Text += line + "\r\n";
                    line = file.ReadLine();
                }
Answer 1

public partial class Form1 : Form
{
    //флаг запуска чтения файла
    private bool _isReading;
    //источник токена отмены
    private CancellationTokenSource _tokenSource;
    public Form1()
    {
        InitializeComponent();
    }
    private void buttonFile_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.InitialDirectory = "D:\\";
        openFileDialog.Filter = "txt files (*.txt)|*.txt";
        openFileDialog.CheckFileExists = true;
        openFileDialog.RestoreDirectory = true;
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            textBoxFile.Text = openFileDialog.FileName;
            buttonReadFile.Enabled = true;
        }
        else
        {
            textBoxFile.Text = String.Empty;
            buttonReadFile.Enabled = false;
        }
    }
    private async void buttonReadFile_Click(object sender, EventArgs e)
    {
        //если процесс чтения уже стартовал
        if (_isReading)
        {
            //отменяем чтение файла
            _tokenSource.Cancel();
            return;
        }

        //флаг чтения
        _isReading = true;
        //интерфейс
        buttonReadFile.Text = "Отменить";
        buttonFile.Enabled = false;
        try
        {
            //готовим токе отмены
            _tokenSource = new CancellationTokenSource();
            var token = _tokenSource.Token;
            //запускаем чтение, по окончании отображаем результат
            textBoxOutput.Text = await Task.Run(() => ReadFile(textBoxFile.Text, token), token);
        }
        catch (OperationCanceledException)
        {
            //чтение было отменено
            textBoxOutput.Text = String.Empty;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Ошибка чтения файла",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            _isReading = false;
            _tokenSource.Dispose();
            buttonReadFile.Text = "Прочитать";
            buttonFile.Enabled = true;
        }
    }
    private string ReadFile(string file, CancellationToken token)
    {
        //для сбора прочитанных строк
        StringBuilder result = new StringBuilder();
        //для отображения прогресса чтения файла
        Action<string> action = s => textBoxOutput.Text = s;
        using (FileStream fs = File.OpenRead(file))
        {
            using (StreamReader sr = new StreamReader(fs))
            {
                string line = String.Empty;
                int counter = 1;
                while ((line = sr.ReadLine()) != null)
                {
                    //выбрасываем исключение в случае отмены
                    token.ThrowIfCancellationRequested();
                    //добавляем прочитанную строку
                    result.AppendLine(line);
                    //показываем прогресс чтения
                    var message = $"Читаем файл..., строка: {counter++}";
                    if (InvokeRequired)
                        this.Invoke(action, message);
                    else
                        action(message);
                }
            }
        }
        return result.ToString();
    }
}
READ ALSO
Как умножить матрицу на вектор(алгоритм)?

Как умножить матрицу на вектор(алгоритм)?

Нужно написать перегруженные функции, которые будут умножать матрицу на матрицу, вектор на матрицу, матрицу на вектор, число на вектор и тдЕдинственный...

242
Цвет пикселя по заданным координатам

Цвет пикселя по заданным координатам

Как можно получить цвет пикселя по координатам x и y ?

177
Биндинг TextBox к одному string в WindowsForms

Биндинг TextBox к одному string в WindowsForms

Мне нужно привязать TextBox к одному stringНужно чтобы при изменении TextBox строка менялась и наоборот

194
Двойной словарь

Двойной словарь

Подскажите пожалуйста, как заполнить такой словарь?

214