事件委托使用时内存泄漏的问题
来源:互联网 发布:淘宝封店了怎么办 编辑:程序博客网 时间:2024/04/28 19:40
事件委托使用时内存泄漏的问题
用C#编写事件或委托时如果处理不好会造成内存泄漏,看下面代码:
public class DoA2EventArgs : EventArgs
{
}
public class ClassA
{
public delegate void DoAEventHandler(object sender, EventArgs e);
public event EventHandler<DoA2EventArgs> DoA2EventHandler;
public DoAEventHandler DoAEvent;
protected void OnDoA2Event(DoA2EventArgs args)
{
EventHandler<DoA2EventArgs> handler = DoA2EventHandler;
if (handler != null)
{
handler(this, args);
}
}
public void DoA()
{
if (DoAEvent != null)
{
DoAEvent(this, new EventArgs());
}
}
public void DoA2()
{
OnDoA2Event(new DoA2EventArgs());
}
~ClassA()
{
Console.WriteLine("Class A Finished!");
}
}
public class ClassB
{
ClassA a;
public ClassB()
{
a = new ClassA();
a.DoAEvent = DoA;
}
public void DoA(object sender, EventArgs e)
{
}
~ClassB()
{
Console.WriteLine("Class B Finished!");
}
}
{
}
public class ClassA
{
public delegate void DoAEventHandler(object sender, EventArgs e);
public event EventHandler<DoA2EventArgs> DoA2EventHandler;
public DoAEventHandler DoAEvent;
protected void OnDoA2Event(DoA2EventArgs args)
{
EventHandler<DoA2EventArgs> handler = DoA2EventHandler;
if (handler != null)
{
handler(this, args);
}
}
public void DoA()
{
if (DoAEvent != null)
{
DoAEvent(this, new EventArgs());
}
}
public void DoA2()
{
OnDoA2Event(new DoA2EventArgs());
}
~ClassA()
{
Console.WriteLine("Class A Finished!");
}
}
public class ClassB
{
ClassA a;
public ClassB()
{
a = new ClassA();
a.DoAEvent = DoA;
}
public void DoA(object sender, EventArgs e)
{
}
~ClassB()
{
Console.WriteLine("Class B Finished!");
}
}
如果我们做如下实现
ClassB b = new ClassB();
ClassA a = new ClassA();
a.DoAEvent = b.DoA;
a.DoA2EventHandler += new EventHandler<DoA2EventArgs>(b.DoA2);
b = null;
GC.Collect();
ClassA a = new ClassA();
a.DoAEvent = b.DoA;
a.DoA2EventHandler += new EventHandler<DoA2EventArgs>(b.DoA2);
b = null;
GC.Collect();
这是我们会发现,虽然对象b已经被赋值为空,但对象并没有被GC回收掉。原因是a对象还存在,同时a对象的DoAEvent
和 DoA2EventHandler 引用了b对象。
要将b回收掉我们可以做如下操作
一种方式是将a回收掉
a = null;
b = null;
这样 b 就回收掉了。
如果不想把a回收掉则
a.DoAEvent = null;
a.DoA2EventHandler -= b.DoA2;
a.DoA2EventHandler -= b.DoA2;
还有一点要提一下的是
ClassB 类内部申明的 ClassA 对象,如果事件委托指向ClassB 对象本身,则不需要额外做操作,b = null; 时
ClassB 和 ClassA 实例都会自动回收。
- 事件委托使用时内存泄漏的问题
- 使用TWebBrowser时存在内存泄漏问题的解决方案
- ios使用SDWebImage加载大图时,内存泄漏的问题
- 关于WebView使用,内存泄漏的问题
- [C#] C#编写事件或委托时如果处理不好会造成内存泄漏
- 实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 1
- 实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 2
- 事件与委托的问题???
- Application对象的使用-数据传递以及内存泄漏问题
- Application对象的使用-数据传递以及内存泄漏问题
- Application对象的使用-数据传递以及内存泄漏问题
- Application对象的使用-数据传递以及内存泄漏问题
- Application对象的使用-数据传递以及内存泄漏问题
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏问题
- 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏问题
- Celery在Django下使用的内存泄漏问题
- 使用C++11解决内存泄漏的问题
- Handler使用中遇到的内存泄漏问题
- C# WinForm下一步一步实现文件的拖入和拖出
- Asp.net MVC 示例项目"Suteki.Shop"分析之---ViewData
- 无砝码天平3次称出12个小球中质量异常球问题
- 自然语言分析、文本分析、全文索引,搜索引擎相关资源汇总
- c#操作XML
- 事件委托使用时内存泄漏的问题
- built-in function
- hibernate的配置
- 如何合并DataTable
- 大规模超文本web搜索引擎剖析-转载
- 公交车路线查询系统后台数据库设计——查询算法
- vb.net常用函数
- ArcObjects开发中的多态与类型转换问题
- Repeater控件使用心得