2009-07-05 5 views
1

Meine Anwendung verwendet eine benutzerdefinierte Liste, die von Bindinglist erbt, die dann an alle UI-Steuerelemente gebunden ist. Die Liste ist eine Sammlung von Basisobjekten, die INotifyPropertyChanged implementiert. Ich vermutete einen Speicherverlust und profilierte meine Anwendung mit memprofiler, die bestätigte, dass alle meine Listen nie entsorgt werden und an denen sie festhalten, weil sie die propertyChanged-Eventhandler der Bindungsliste abonniert haben. HierBindingList-Speicherverlust

ist die Probe meiner Objekte

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); 
    } 
} 

Hier ist die Zuordnung Stapel aus dem Profiler

[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 

mir jemand angeordnet in immer die Listen helfen können.

Dank all


Henk, waren Sie recht. Das Problem war nicht mit dem Code, den ich erwähnt habe, sondern ich habe ihn auf Delegierte beschränkt, die verhindern, dass meine Form entsorgt wird. Ich arbeite an einer Probe, um das Problem zu replizieren, das ich auf die Seite hochladen werde. Danke

Antwort

2

Ich glaube nicht, dass das Problem in dem hier gezeigten Code ist, verursacht das Ereignis in BaseObject nur ausgehende Referenzen (zu den Teilnehmern). Es wird ein wenig fraglich mit dem Ausblenden von Add/Remove und der BaseList-Klasse. Könnte es sein, dass der benutzerdefinierte Code <> das Abonnieren/Abmelden des PropertyChanged-Ereignisses beeinträchtigt?

Und ist where T:BaseList ein Tippfehler (ich würde baseObject hier erwarten) oder gibt es eine andere Klasse beteiligt?

Auf einer Seite zur Kenntnis, bin ich ein wenig von der ‚virtuellen‘ verwirrt in

public virtual event PropertyChangedEventHandler PropertyChanged; 

Ich bin nicht sicher, ob Sie einen Zweck dafür haben, denke ich, es gehen sollte. Die BaseBusinessList sollte wahrscheinlich IRaiseItemChangedEvents

implementieren