Доброго времени суток всем.
Используя mem profiler обнаружил что в определенных слуачях в памяти остаются формы и, соответственно, все на что они ссылаются, даже после явного вызова Dispose.
После некоторого копания проблема оказалась в использовании внешнего ImageList.
Т.е. в конструкторе формы я ставил ImageList из своего сервиса, он достаточно большой что бы его бездумно копировать.
public MyFilterCtl()
{
SetStyle(ControlStyles.ContainerControl, true);
InitializeComponent();
listView1.SmallImageList = MyContext.CommonImageList;
toolStrip1.ImageList = MyContext.CommonImageList;
}
В этом случае форма оставалась и висела в памяти вплоть до освобождения ImageList.
Дело оказалось в выделенных двух свойствах. Глянув через рефлектор увидел, что при установке свойства на них вешается 2 обработчика
ListView.set
{
EventHandler handler = new EventHandler(this.SmallImageListRecreateHandle);
EventHandler handler2 = new EventHandler(this.DetachImageList);
if (value != null)
{
value.RecreateHandle += handler;
value.Disposed += handler2;
}
А в Dispose снимается только один.
protected override void ListView.Dispose(bool disposing)
{
if (disposing)
{
if (this.imageListSmall != null)
{
this.imageListSmall.Disposed -= new EventHandler(this.DetachImageList);
this.imageListSmall = null;
}
}
}
Подобная ситуация но несколько сложнее и в ToolStrip.
Решение то простое, в Dispose формы обнулять эти свойства, но это как то эээ не по нетовски...
Это баг, или я не прав и должен ручками занулять все что я установил?