您的位置:首页 > 其它

.Net开发笔记(六)关于事件(续)

2013-01-17 18:01 253 查看
上一篇最后提到了怎么解决由“事件编程”引起的内存泄露问题,最后几句说到了由“弱引用”的概念引申出来“弱委托”。具体没说怎么去实现,这篇文章介绍一下具体实现过程。(请先看前一篇文章)

先来看一下MSDN上对Delegate(委托)的解释:

表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。

我们先不去管网上对“委托”的其他形象比如,比如“类似函数指针”、“对同一类方法的签名”等等。先来看看MSDN上的解释是个什么意思。首先它是一种数据结构,基本可以看做包含两个东西,一个是方法,一个是方法的所有者,即对象(静态方法的所有者为类)。那么我们可以简单的用图来画一下:

View Code

class Program
{
static void Main(string[] args)
{
//Subject sub = new Subject(); //事件发布者
//Observer obs = new Observer(); //事件观察者
//obs.RegisterXX1(sub); //观察者注册事件XX1,两者建立关联

//sub.DoSomething(); //发布者激发事件
////输出XX1 event raised!

////强制GC回收obs内存,结束obs的生命期
//obs = null;
//GC.Collect();
//Console.WriteLine("obs is 'dead'?!");

//sub.DoSomething(); //再次激发事件
////obs已死,不会再响应XX1事件

//Console.Read();

Subject sub = new Subject(); //事件发布者
Observer obs = new Observer(); //事件观察者
obs.RegisterXX1(sub); //观察者注册事件XX1,建立关联
obs.RegisterCommonEvent(sub); //观察者注册事件CommonEvent,建立关联

sub.DoSomething(); //事件发布者激发事件
//输出   XX1 event raised!
//       CommonEvent event raised!

//强制GC回收obs内存,结束obs的生命期,但是徒劳!!!
obs = null;
GC.Collect();
Console.WriteLine("obs is 'dead'?!");

sub.DoSomething(); //再次激发事件
//obs并没有死去,会再次响应事件
//输出   XX1 event raised!
//       CommonEvent event raised!

//因此,obs并没有我们期待的那样结束了自己的生命期
Console.Read();
}
}


被注释部分事件发布者与观察者之间属于弱关联,观察者能够正常死亡;未被注释部分事件发布者与观察者属于强关联,观察者不能正常死亡。

运行结果如下:



图3



图4

本文代码均已调试通过,环境(XP+.net 3.5)。

本文所有事件,均没有考虑“多线程”情况。

希望有帮助,O(∩_∩)O~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐