Хобрук: Ваш путь к мастерству в программировании

Исключение OutOfMemory в WinForms RichTextBox

Я использую экземпляры RichTextBox в нескольких методах, которые меняют шрифт, цвет, конвертируют изображения в формат Rtf.

public static string ColorText(string text)
{
    System.Windows.Forms.RichTextBox rtb = new System.Windows.Forms.RichTextBox();

    rtb.Text = conversation;

    // find predefined keywords in text, select them and color them

    return rtb.Rtf;
}

Через некоторое время я получаю OutOfMemory Exception. Мне позвонить rtb.Dispose();? Или GC.Collect или используйте using Или как правильно?


  • Вы уверены, что RichTextBox выдает вам исключение нехватки памяти? Вы можете поделиться исключением? 25.09.2012
  • это не имеет смысла, за исключением того, что где-то у вас есть бесконечный цикл 25.09.2012
  • Исключение отображается после нескольких часов использования. Я думаю, что что-то осталось в памяти. Но я не знаю почему. Я пробовал использовать Dispose, используя и GC. И теперь ждем, что же это будет делать в Process Monitor. 25.09.2012
  • Пожалуйста, прочитайте Как написать идеальный вопрос, особенно часть о примерах кода. Кроме того, трудно помочь, если вы не можете опубликовать либо трассировку стека исключений, либо шаги для воспроизведения ошибки. 25.09.2012
  • Извините и спасибо за ссылку, я исправлю свои вопросы. Это основной вопрос моего вопроса: если у меня есть несколько окон с RichTextBox и много форматированного текста в нем, и все это в одном приложении. И я закрою некоторые окна, если он будет автоматически удалять ресурсы RTB, или я должен вызвать GC.Collect. И если я использую экземпляр RTB в методе, должен ли я использовать using или Dispose. 25.09.2012

Ответы:


1

Из отладчика видно, что свойство rtb.IsHandleCreated будет true после того, как вы получите значение свойства Rtf. Это проблема, оконные дескрипторы сохраняют свою оболочку. Вы должны снова удалить элемент управления, чтобы уничтожить дескриптор:

public static string ColorText(string text) {
    using (var rtb = new System.Windows.Forms.RichTextBox()) {
        rtb.Text = text;
        return rtb.Rtf;
    }
}

Или сохраните «rtb» в статической переменной, чтобы использовать только один экземпляр.

24.09.2012
Новые материалы

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

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

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..