Я отслеживал утечку памяти и я узкий d до всплывающей подсказки, которая выделяется в классе, производном от 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 не вызывается, по-видимому, из-за того, что остались ссылки на всплывающую подсказку.
Я добавил такой метод Shutdown:
public void Shutdown()
{
toolTip1.RemoveAll();
}
Вызов метода Shutdown устраняет утечку, и в конечном итоге вызывается Dispose.
К сожалению, это решение требует, чтобы тот, кто использует элемент управления, запомнил вызов метода Shutdown, когда он закончит с ним.
Я хотел бы знать, есть ли способ автоматизировать это, чтобы это происходило без необходимости явно вызывать метод Shutdown.