1

私のアプリケーションは、すべての UI コントロールにバインドされる Bindinglist から継承するカスタム リストを使用します。リストは、INotifyPropertyChanged を実装する baseobjects のコレクションです。メモリ リークが疑われ、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

誰かがリストを処分するのを手伝ってくれますか?

皆さんありがとう


ヘンク、あなたは正しかった。問題は、私が言及したコードではなく、フォームの破棄を妨げているデリゲートに絞り込みました。サイトにアップロードする問題を再現するサンプルに取り組んでいます。ありがとう

4

1 に答える 1

2

ここに示されているコードに問題があるとは思わない。BaseObjectのイベントは(サブスクライバーへの)発信参照のみを引き起こします。Add/RemoveとBaseListクラスを非表示にすると少し不自然になります。<カスタムコード>がPropertyChangedイベントのサブスクライブ/サブスクライブ解除を妨害している可能性がありますか?

そしてwhere T:BaseList、タイプミス(ここではbaseObjectを期待します)ですか、それとも別のクラスが関係していますか?

ちなみに、私は「仮想」に少し戸惑っています。

public virtual event PropertyChangedEventHandler PropertyChanged;

その目的があるかどうかはわかりませんが、行くべきだと思います。

そして、BaseBusinessListはおそらくIRaiseItemChangedEventsを実装する必要があります

于 2009-07-05T11:49:30.993 に答える