Утечка памяти BindingList

В моем приложении используется пользовательский список, наследуемый от Bindinglist, который затем привязывается ко всем элементам управления пользовательского интерфейса. Список представляет собой набор базовых объектов, который реализует INotifyPropertyChanged. Я заподозрил утечку памяти и профилировал свое приложение с помощью memprofiler, который подтвердил, что все мои списки никогда не удаляются и что они цепляются, потому что они подписаны на обработчики событий propertyChanged списка привязок.

Вот образец моих объектов

public abstract class BaseObject:IDataErrorInfo,INotifyPropertyChanged,ICloneable
{
private Guid _Id = Guid.NewGuid();
public virtual Guid ID
{
    get { return this._Id; }
    set { this._Id = value;  this.OnPropertyChange(new 
                           PropertyChangedEventArgs(propertyName)); }
}

[field:NonSerialized]
public virtual event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChange(PropertyChangedEventArgs e)
{
    if (this.PropertyChanged != null) this.PropertyChanged(this, e);
}   
}

[Serializable]
public class BaseList<T> :BindingList<T>,ICloneable where T:BaseObject
{
public new void Add(T item)
{      
    <Custom code>
    base.Add(item);
     }

public new void Remove(T item)
{
    <Custom Code>
    base.Remove(item);
     }
}

Вот стек выделения из профилировщика

[Skipped frame(s)]
mscorlib!System.MulticastDelegate.CombineImpl( Delegate )
mscorlib!System.Delegate.Combine( Delegate, Delegate )
<AppName>.Data!<AppName>.Data.BaseObject.add_PropertyChanged( 
              PropertyChangedEventHandler )

[Skipped frame(s)]
System!System.ComponentModel.BindingList<T>.InsertItem( int, T )
mscorlib!System.Collections.ObjectModel.Collection<T>.Add( T )
<AppName>.Data.BaseList<T>.Add( T ) BaseList.cs
<AppName>.UI.Forms.Form1.GetData() Form1
<AppName>.UI.Forms.Form1.Initialize() Form1
<AppName>.UI.Forms.Form1.RunAsyncComplete() Form1

Может ли кто-нибудь помочь мне избавиться от списков.

Спасибо всем


Хенк, ты был прав. Проблема была не в коде, который я упомянул, вместо этого я сузил его до делегатов, которые препятствуют удалению моей формы. Я работаю над образцом, чтобы воспроизвести проблему, которую я загружу на сайт. Спасибо


person Raj G    schedule 05.07.2009    source источник


Ответы (1)


Я не думаю, что проблема в показанном здесь коде, событие в BaseObject вызывает только исходящие ссылки (к подписчикам). Это становится немного сомнительным из-за сокрытия Add/Remove и класса BaseList. Может быть, ‹ Пользовательский код> мешает подписке/отмене подписки на событие PropertyChanged?

И является ли where T:BaseList опечаткой (я бы ожидал здесь baseObject) или здесь задействован другой класс?

Кстати, меня немного озадачивает «виртуальный» в

public virtual event PropertyChangedEventHandler PropertyChanged;

Я не уверен, есть ли у вас цель для этого, я думаю, что это должно уйти.

И BaseBusinessList, вероятно, должен реализовать IRaiseItemChangedEvents

person Henk Holterman    schedule 05.07.2009