Запись огромного количества текста в текстовое поле - PullRequest
10 голосов
/ 07 августа 2010

Я записываю журнал с большим и большим количеством форматированного текста в текстовое поле в приложении .net windows form.

Это медленно, когда данные преодолевают несколько мегабайт. Так как я добавляю строку нужно перераспределять каждый раз, верно? Мне нужно только установить значение в текстовое поле один раз, но в моем коде я делаю line+=data десятки тысяч раз.

Есть ли более быстрый способ сделать это? Может быть другой контроль? Можно ли использовать строку типа связанного списка?

Ответы [ 3 ]

7 голосов
/ 07 августа 2010

StringBuilder не поможет, если текстовое поле будет добавлено постепенно, например, при выводе журнала.

Но, если вышеприведенное верно и если ваши обновления достаточно часты, вам может потребоваться кешировать некоторое количество обновлений, а затем добавлять их за один шаг (вместо того, чтобы постоянно добавлять).Это сэкономит вам много перераспределений строк ... и тогда будет полезно StringBuilder.

Примечания:

  1. Создайте элемент StringBuilder в области классов (_sb)
  2. Запустить таймер (или использовать счетчик)
  3. Добавить текстовые обновления к _sb
  4. Когда тик таймера или определенный счетчик достиг сброса и добавить в текстовое поле
  5. перезапустить процесс с # 1
6 голосов
/ 07 августа 2010

Никто еще не упомянул виртуализацию, которая действительно является единственным способом обеспечить предсказуемую производительность для огромных объемов данных.Даже использование StringBuilder и преобразование его в строку каждые полсекунды будет очень медленным, как только журнал станет достаточно большим.

При виртуализации данных вы будете хранить только необходимые данныев памяти (то есть, что пользователь может видеть, и, возможно, немного больше с обеих сторон), в то время как остальное будет храниться на диске.Старые данные будут «выкатываться» из памяти, когда на смену им приходят новые данные.

Чтобы TextBox выглядел так, как будто в нем много данных,Вы бы сказали, что это так.Когда пользователь прокручивает, вы должны заменить данные в буфере соответствующими данными из базового источника (используя произвольный доступ к файлу).Таким образом, ваш пользовательский интерфейс будет отслеживать файл, а не прослушивать события в журнале.

Конечно, это гораздо больше работы, чем просто использование StringBuilder, но я подумал, что стоит упомянуть на всякий случай.

5 голосов
/ 07 августа 2010

Создайте свою строку вместе с StringBuilder, затем преобразуйте ее в строку, используя toString(), и назначьте ее текстовому полю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...