Я выследил утечку памяти и сузил ее до всплывающей подсказки, которая размещена в классе, производном от UserControl.
Всплывающая подсказка размещается в выделенном конструкторе элемента управления и инициализируется в событии Load следующим образом:
public class CommonProfile : System.Windows.Forms.UserControl
{
private ToolTip toolTip1;
...
public CommonProfile()
{
InitializeComponent();
// Create the ToolTip and associate with the Form container.
toolTip1 = new ToolTip(this.components);
}
private void CommonProfile_Load(object sender, System.EventArgs e)
{
// Set up the delays for the ToolTip.
toolTip1.AutoPopDelay = 5000;
toolTip1.InitialDelay = 1000;
toolTip1.ReshowDelay = 500;
// Force the ToolTip text to be displayed whether or not the form is active.
toolTip1.ShowAlways = true;
// Set up the ToolTip text
toolTip1.SetToolTip(this.btnDeleteEntry, "Delete this Profile");
toolTip1.SetToolTip(this.lblProfileType, "Edit this Profile");
toolTip1.SetToolTip(this.lblProfileData, "Edit this Profile");
toolTip1.SetToolTip(this.picFlagForUpdate, "Toggle Flag for Update");
}
}
Срок действия родительского элемента управления превышает срок его существования. Этот элемент управления создается «на лету» и добавляется к элементу управления панели, а затем впоследствии удаляется из элемента управления панели.
Я обнаружил, что элемент Dispose элемента управления не вызывается, по-видимому, потому что ссылки на всплывающую подсказку остаются.
Я добавил метод выключения следующим образом:
public void Shutdown()
{
toolTip1.RemoveAll();
}
Вызов метода Shutdown устраняет утечку, и в конечном итоге вызывается утилизация.
К сожалению, это решение требует, чтобы тот, кто использует элемент управления, не забывал вызывать метод Shutdown по окончании работы с ним.
Я хотел бы знать, есть ли какой-нибудь способ, которым я могу автоматизировать это так, чтобы это происходило без явного вызова метода Shutdown.