我的应用程序使用从 Bindinglist 继承的自定义列表,然后绑定到所有 UI 控件。该列表是实现 INotifyPropertyChanged 的基本对象的集合。我怀疑内存泄漏并使用 memprofiler 对我的应用程序进行了分析,这确认我的所有列表都从未被释放,并且它们一直在坚持,因为它们订阅了 bindinglist 的 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
有人可以帮我处理清单吗?
谢谢大家
亨克,你是对的。问题不在于我提到的代码,而是我将其范围缩小到阻止我的表单被处理的代表。我正在制作一个样本来复制我将上传到网站的问题。谢谢