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