Доброго времени суток всем.
Используя 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 формы обнулять эти свойства, но это как то эээ не по нетовски...
Это баг, или я не прав и должен ручками занулять все что я установил?
Здравствуйте, Sirotkin Alexander, Вы писали:
SA>Доброго времени суток всем.
SA>Используя mem profiler обнаружил что в определенных слуачях в памяти остаются формы и, соответственно, все на что они ссылаются, даже после явного вызова Dispose.
SA>После некоторого копания проблема оказалась в использовании внешнего ImageList.
SA>Подобная ситуация но несколько сложнее и в ToolStrip.
SA>Решение то простое, в Dispose формы обнулять эти свойства, но это как то эээ не по нетовски...
SA>Это баг, или я не прав и должен ручками занулять все что я установил?
Да, это баг. У нас та же проблема была. Лечили занулением, как вы описали.
В connect.microsoft.com уже есть
багрепорт на эту тему. И судя по реакции MS —
Closed as Won't Fix — фиксить они этот баг не собираются.
Да и это понятно — WinForms их больше не интересует. Теперь все силы брошены на WinRT, WPF и т.п... Так что теперь и остальные баги в WinForms никто чинить не будет. Я не удивлюсь, если скоро эту подсистему из .NET framework вообще выпилят.