xuyunhai20160827 Ответов: 2

Вопрос о richtextbox


мне нужно загрузить большой файл в richtextbox,около 500 Мб.
Содержимое текстового файла выглядит следующим образом:
1.sldkjfwelj
2.sdgofwet
3.lisdgffhs
4.ohsdgsdlgn
.....
Есть около 10000000 линий.
Как быстро загрузиться, не делая главное окно невосприимчивым?

Что я уже пробовал:

USB на memorymappedfile размещенный на CreateViewStream.
using (var stream = MemoryMap.CreateViewStream(0, viewSize, MemoryMappedFileAccess.ReadWrite))
   using (var sr = new StreamReader(stream, Encoding.Default))
   {
       this.rtbEditGcode.Text = sr.ReadToEnd();
   }

   MemoryMap.Dispose();

но это слишком медленно.

BillWoodruff

Если использование файла, сопоставленного с памятью, слишком медленное, то оно всегда будет слишком медленным.

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

Dave Kreskowiak

Во-первых, почему вы пытаетесь показать пользователю 10 000 000 строк текста? Это совершенно бесполезно. Для этого нет никаких оснований.

2 Ответов

Рейтинг:
2

Maciej Los

Цитата:
Как быстро загрузиться, не делая главное окно невосприимчивым?

Общая причина такого поведения заключается в том, что элементы управления запускают несколько событий одновременно. Если какой-то процесс занимает много времени, это делает окно невосприимчивым.
У вас есть 2 возможности:

1. Использование SuspendLayout[^] и ResumeLayout[^] методы
this.rtbEditGcode.SuspendLayout();
//your code to load data to RichTextBox here
this.rtbEditGcode.ResumeLayout();


2. Использование вызовов потокобезопасных методов (рекомендуемый)
Видеть: Как сделать Потокобезопасные вызовы элементов управления Windows Forms | Microsoft Docs[^]


Рейтинг:
1

Wendelius

Одна вещь заключается в том, что вы пытаетесь свести к минимуму время, необходимое для загрузки файла, и таким образом сделать пользовательский интерфейс более отзывчивым. Но другой вопрос, почему вы хотите заблокировать доступ к пользовательскому интерфейсу во время загрузки данных.

Отсутствие ответа вызвано тем, что вы делаете что-то еще в потоке, который запускает пользовательский интерфейс, и этот поток не может ответить ни на одно событие, отправленное в пользовательский интерфейс. Поэтому, если вы хотите, чтобы ваше приложение оставалось отзывчивым при загрузке данных, решение состоит в том, чтобы загрузить данные в другой поток.

Так почему бы и нет
- Когда начнется загрузка, отключите richtextbox. Таким образом, никто не может вносить изменения в управление
- Выполните загрузку данных из файла в другой поток, например с помощью Класс BackgroundWorker (System.ComponentModel)[^]
- После того как загрузка завершиться, обновления содержимого richtextbox
- Снова включите richtextbox

Таким образом, ваш пользовательский интерфейс может выполнять другие операции, пока файл загружается в фоновом режиме.