Имеется файл, где большое количество строк. Вывод файла осущствляется построчно циклом. Но из-за того, что файл большой, действие идет больше 60 сек и вызывается исключение. Как решить эту проблему?
StreamReader file = new StreamReader("buffer2.txt");
string line = file.ReadLine();
while (line != null)
{
textBox3.Text += line + "\r\n";
line = file.ReadLine();
}
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();
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно написать перегруженные функции, которые будут умножать матрицу на матрицу, вектор на матрицу, матрицу на вектор, число на вектор и тдЕдинственный...
Мне нужно привязать TextBox к одному stringНужно чтобы при изменении TextBox строка менялась и наоборот