Я создал пользовательский элемент управления, как показано ниже.Шрифт вызывает утечку GDI в пользовательском контроле
public partial class TextBoxEx : TextBox
{
public TextBoxEx()
{
InitializeComponent();
Font = Utility.normalFont;
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
//A utility class to initialize font.
class Utility
{
internal static Font normalFont = new Font("Arial", 18);
}
У меня есть две формы Form1 и Form2. Этот TextBoxEx добавляется в Form2. Я показываю Form2 при нажатии кнопки в Form1.
Непрерывное отображение и закрытие формы2 вызывает утечку GDI в моем приложении. После анализа с помощью инструмента обнаружения GDI (Bear.exe) обнаружено, что шрифт вызывает утечку GDI.
Мой вопрос,
- Почему шрифт не выделяется, даже если метод Dispose() из TextBoxEx является дозвонились. (При закрытии Form2, Dispose() метод TextBoxEx будет вызываться автоматически).
- Как я могу решить утечку GDI, вызванную шрифтом ?. (Font.Dispose() не может быть вызван в методе Dispose() TextBoxEx. Потому что он вызывает исключение «Параметр недействителен» в конструкторе).
Шрифт не должен выпускаться, поскольку он ссылается на статическую переменную normalFont. Я не думаю, что это утечка вообще. –
@Alex: Когда я прокомментирую эту строку кода «Font = Utility.normalFont;», утечка исчезнет. Я думаю, что Шрифт хранит копию, а не ссылку. Я мог бы решить проблему утечки GD, установив Font = null в методе Dispose() TextBoxEx. Но это хорошая идея? – NidhiSree
Шрифт является ссылочным типом, поэтому он не копируется. Я думаю, что ваш анализатор утечек дает неверную информацию.Прочитайте ответ Ханса Пассана, вы нигде не найдете лучшего эксперта :) –