c#弱事件(weak event)
传统事件publisher和listener是直接相连的,这样会对垃圾回收带来一些问题,例如listener已经不引用任何对象但它仍然被publisher引用
垃圾回收器就不能回收listener所占用的内存以及publisher仍然引用该listener向其触发事件。
而弱事件就解决了这个问题
WeakEventManager是publisher和listener之间的桥梁,从而取代两者之间的直接连接
一、定义WeakEventManager类
public class WeakCarInfoEventManager : WeakEventManager
{
public static void AddListener(object source,IWeakEventListener listener)
{
CurrentManager.ProtectedAddListener(source, listener);
}
public static void RemoveListener(object source,IWeakEventListener listener)
{
CurrentManager.ProtectedRemoveListener(source, listener);
}
public static WeakCarInfoEventManager CurrentManager
{
get
{
var manager = GetCurrentManager(typeof(WeakCarInfoEventManager))
as WeakCarInfoEventManager;
if(manager == null)
{
manager = new WeakCarInfoEventManager();
SetCurrentManager(typeof(WeakCarInfoEventManager), manager);
}
return manager;
}
}
protected override void StartListening(object source)
{
(source as CarDealer).NewCarInfo += CarDealer_NewCarInfo;
}
void CarDealer_NewCarInfo(object sender,CarInfoEventArgs e)
{
DeliverEvent(sender, e);
}
protected override void StopListening(object source)
{
(source as CarDealer).NewCarInfo -= CarDealer_NewCarInfo;
}
}
二、定义事件监听者(listener)
public class Consumer:IWeakEventListener //主要要继承改接口
{
private string name;
public Consumer(string name)
{
this.name = name;
}
public void NewCarIsHere(object sender,CarInfoEventArgs e)
{
Console.WriteLine("{0}:car {1} is new", name, e.Car);
}
bool IWeakEventListener.ReceiveWeakEvent(Type managerType,object sender,EventArgs e)
{
NewCarIsHere(sender, e as CarInfoEventArgs);
return true;
}
}
三、事件发布者(publisher)
public class CarInfoEventArgs : EventArgs //自定义事件数据参数
{
public CarInfoEventArgs(string car)
{
this.Car = car;
}
public string Car { get; private set; }
}
public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo;
public void NewCar(string car)
{
Console.WriteLine("Car dealer, new car {0}", car);
RaiseNewCarInfo(car);
}
protected virtual void RaiseNewCarInfo(string car)
{
EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
if (newCarInfo != null)
{
newCarInfo(this, new CarInfoEventArgs(car));
}
}
}
四、在启动函数中通过WeakCarInfoEventManager把publisher和listener联系起来
class Program
{
static void Main(string[] args)
{
var dealer = new CarDealer();
var tian = new Consumer("tian");
WeakCarInfoEventManager.AddListener(dealer, tian);
dealer.NewCar("奔驰");
var tian1 = new Consumer("tian1");
WeakCarInfoEventManager.AddListener(dealer, tian1);
dealer.NewCar("东风");
Console.ReadKey();
}
}
运行结果如下:
最后.net4.5版本已经将weakeventmanager集成进来这样使用会更加方便
static void Main(string[] args)
{
var dealer = new CarDealer();
var tian = new Consumer("tian");
//WeakCarInfoEventManager.AddListener(dealer, tian);
WeakEventManager<CarDealer, CarInfoEventArgs>.AddHandler(dealer, "NewCarInfo", tian.NewCarIsHere);
dealer.NewCar("奔驰");
var tian1 = new Consumer("tian1");
//WeakCarInfoEventManager.AddListener(dealer, tian1);
WeakEventManager<CarDealer, CarInfoEventArgs>.AddHandler(dealer, "NewCarInfo", tian1.NewCarIsHere);
dealer.NewCar("东风");
Console.ReadKey();
}
与上面的运行结果是一样的
c#弱事件(weak event)的更多相关文章
- 【转载】详细解读C#中的 .NET 弱事件模式
你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处理中展 ...
- WPF: 深入理解 Weak Event 模型
在之前写的一篇文章(XAML: 自定义控件中事件处理的最佳实践)中,我们曾提到了在 .NET 中如果事件没有反注册,将会引起内存泄露.这主要是因为当事件源会对事件监听者产生一个强引用,导致事件监听者无 ...
- C#中的 .NET 弱事件模式
引言 你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处 ...
- [AaronYang]C#人爱学不学8[事件和.net4.5的弱事件深入浅出]
没有伟大的愿望,就没有伟大的天才--Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 事件-我的讲法 老师常告诉我,事件是特殊的委托,为委托提供了一种发布/订阅机制. ...
- WPF 弱事件
因为在接触WPF的过程中追查INotifyPropertyChanged的通知原理的时候,发现了 PropertyChangedEventManager这个类,它是继承与WeakEventManage ...
- .net4.5的弱事件
.net4.5的弱事件 没有伟大的愿望,就没有伟大的天才--Aaronyang的博客(www.ayjs.net)-www.8mi.me 1. 事件-我的讲法 老师常告诉我,事件是特殊的委托,为委托提供 ...
- WPF程序中的弱事件模式
在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源.但是,GC有的时并不是按照我们所期望的方式工作. 例如,我想实现一个在窗口的标题 ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
- 事件(event),正则
1.事件(event):事件是可以被 JavaScript 侦测到的行为.网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件.2.事件源: 触发事件的元素 事件: 被 JavaS ...
随机推荐
- office文件的预览
使用FlexPaper实现office文件的预览(C#版) 需求很简单,用户上传office文件(word.excel.ppt)后,可以预览上传的这些文件.搜索的相关的资料后.整理如下: Step1. ...
- Session、Application、Cache
[Asp.Net]状态管理(Session.Application.Cache) 上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329 ...
- MySQL 常用命令大全
Mysql常用命令行大全 第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键 ...
- WCF小实例以及三种宿主
WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...
- IP选路
IP选路 1.概述 路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类 从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. ...
- EventBus实现 - 发布订阅 - XML加载
EventBus实现 - 发布订阅 - XML加载 受到CQRS的影响,写了个EventBus,能实现发布订阅模式执行event,在DDD模型中,可以使用如下代码触发事件: EventBus bus ...
- .net基础收集
.net基础收集 最近的面试让我知道基础知识的重要性,而我也每天都在网上找一些基础题来看.其实面试无非都是一些理论基础,只有基础过关了,才会被问到技术性的问题,所以第一关一定要打好.下面是我收集的一些 ...
- 理解git对象
1. 首次提交,提交一个简单的文件 a.txt ,commit 之后的图如下: 如图所示,生成了 3 个对象,一个 commit 对象,一个 tree 对象,一个 blob 对象.图上蓝底是 co ...
- base关键字
base关键字 专门用来在子类访问父类成员 base.标识符:“.”调用父类同名属性.同名函数.构造函数 ()父类person public class Person { public Pe ...
- Xpath学习笔记
最近复习自己上一年的课本,想起来刚学那个时候想做一个写日记的软件. 想不如做,用控制台瞎写了一个,一做就成了,没什么bug,期间使用Xpath来读数据,所以就稍微学了一下. 学习过程就这样做一点笔记, ...