c# – 如何处理实现IDisposable的类中的委托/事件引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何处理实现IDisposable的类中的委托/事件引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2213字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何处理实现IDisposable的类中的委托/事件引用](/upload/InfoBanner/zyjiaocheng/792/9e6ee926caa54a4ebbef9aa5ef28f4a6.jpg)
我一直在阅读关于内存管理的内容,并且在一个项目中遇到过这样的情况,在这个项目中,Google和Google都没有提出确切的答案.我已经知道委托是管理对象,事件是委托实例.话虽如此,一旦应用程序结束,代理实例将从内存中删除.
我无法弄清楚的是如何确保外部代码在我的类处理时(显式地或通过GC)释放所有事件引用.例如,A类公开一个事件而B类使用它. B类在A类上调用Dispose而不释放对代理的引用.当然,我们不能从Dispose方法本身抛出错误.
以下是一个带有委托的类和另一个使用它的类.
public class ClassB
{
private ClassA A { get; set; }
public ClassB()
{
this.A = new ClassA();
this.A.OnProcessed += new ClassA.DelegateProcessed(this.ClassA_Processed);
}
public void Process()
{
this.A.Process();
}
public void ClassA_Processed (ClassA sender, EventArgs e)
{
// Do something.
// Code written by another developer does not free up events before calling Dispose.
this.A.Dispose();
this.A = null;
}
}
public class ClassA: IDisposable
{
public delegate void DelegateProcessed (A sender, EventArgs e);
public event DelegateProcessed OnProcessed = null;
~ClassA() { this.Dispose(false); }
public void Dispose ()
{
this.Dispose(true);
System.GC.SuppressFinalize(this);
}
private void Dispose (bool disposing)
{
if (!this.Disposed)
{
if (disposing)
{
// Dispose managed resources here.
// Is it possible / advisable to dispose of delegates / events here?
// Will this adversely affect the consumer class?
this.OnProcessed -= new ClassA.DelegateProcessed(this.ClassA_Processed);
}
}
this.Disposed = true;
}
public void Process () { this.OnProcessed(this, new EventArgs()); }
public void ClassA_Processed (ClassA sender, EventArgs e) { }
}
重点是确保无论开发人员使用ClassB做什么,ClassA都有资格进行垃圾收集.关键是尽量减少ClassA在内存中花费的时间,即使消费者不小心.
更新:从答案中可以清楚地看出,事件不必从ClassA中明确删除.至于主要问题,弱参考似乎是下面回答的方式.目标是最小化ClassA在内存中停留的时间.如果我忽视了任何事情,请告诉我.
解决方法:
而不是“经典”事件订阅,你应该看看Weak Event Patterns.
事件订阅可以使对象保持活动状态,即使这些引用是唯一的引用,并且引用的对象本身已经超出范围.在这种情况下,引用的对象永远不会被GarbageCollector收集并保持活动直到应用程序结束.
这会导致严重的内存泄漏.
如果您使用的是弱事件模式,则允许GabageCollector更好地确定对象是否仍被引用,或者事件是否是唯一的引用.在这种情况下,会收集对象并释放资源.
内容总结
以上是互联网集市为您收集整理的c# – 如何处理实现IDisposable的类中的委托/事件引用全部内容,希望文章能够帮你解决c# – 如何处理实现IDisposable的类中的委托/事件引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。