У меня есть прекрасная задача разработать, как обрабатывать большие файлы, загружаемые в наш редактор приложений script (это похоже на VBA для нашего внутреннего продукта для быстрых макросов). Большинство файлов составляют около 300-400 килобайт, что является хорошей загрузкой. Но когда они выходят за рамки 100 Мб, процесс имеет трудное время (как и следовало ожидать).
Что происходит, так это то, что файл читается и перемещается в RichTextBox, который затем перемещается - не беспокойтесь слишком много об этой части.
Разработчик, который написал исходный код, просто использует StreamReader и делает
[Reader].ReadToEnd()
который может занять довольно много времени.
Моя задача - разбить этот бит кода, прочитать его в кусках в буфер и показать панель прогресса с возможностью ее отмены.
Некоторые предположения:
- Большинство файлов будут 30-40 MB
- Содержимое файла является текстовым (не двоичным), некоторые являются Unix-форматом, некоторые DOS.
- После получения содержимого мы выясним, какой терминатор используется.
- Никто не беспокоился, когда он загрузил время, необходимое для рендеринга в richtextbox. Это просто начальная загрузка текста.
Теперь для вопросов:
- Могу ли я просто использовать StreamReader, а затем проверить свойство Length (так что ProgressMax) и выдать значение Read для заданного размера буфера и выполнить итерацию через цикл WHILST внутри рабочего фона, поэтому он не блокирует основной поток пользовательского интерфейса? Затем верните stringbuilder в основной поток после его завершения.
- Содержимое будет передано в StringBuilder. могу ли я инициализировать StringBuilder с размером потока, если длина доступна?
Являются ли эти (в ваших профессиональных мнениях) хорошие идеи? В прошлом у меня было несколько проблем с чтением контента из Streams, потому что он всегда будет пропускать последние несколько байтов или что-то в этом роде, но я задам еще один вопрос, если это так.