Утечки памяти при использовании в формах внешнего ImageList, недочет?
От: Sirotkin Alexander  
Дата: 01.11.12 11:11
Оценка:
Доброго времени суток всем.

Используя 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 формы обнулять эти свойства, но это как то эээ не по нетовски...

Это баг, или я не прав и должен ручками занулять все что я установил?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.