铁血规则:事件预订与取消预订

  在编码的时候,我们经常预订某个事件来处理它,但很少取消事件的预订,这种做法可能导致程序在运行时出现一些异常。

      如果你的某个用于处理事件的对象不是在运行期内永久存在的(比如,不是Singleton对象),那么请记住一条规则:在该对象(事件预订者)的生命周期中只要预订了其他对象(事件发布者)的事件,那么在该对象释放时,一定要取消这些事件的预订。否则,在预订者被释放后,发布者仍然保持着预订者的引用,在对应的事件被触发时,发布者仍然会持有预订者的引用(导致内存泄露),并且调用预订者的处理函数,而由于预订者已经被释放,所以可能引发莫名其妙的问题。(这条规则很早就总结出来了,最近却忘记了,以至于浪费了半天的时间来跟踪一个奇怪的现象。以此记录作为前车之鉴,呵呵)

      实践这条规则很简单,一般这样做就可以了:

(1)在预订者的构造函数或初始化函数中预订事件。

(2)在预订者的析构函数或Dispose方法中取消事件预订。

      比如:

    public class Publisher
    {
        public event CbGeneric SomeEvent;
    }

    public class Subscriber :IDisposable
    {
        private Publisher publisher;

        public Subscriber(Publisher _publisher)
        {
            this.publisher = _publisher ;
            //预订事件
            this.publisher.SomeEvent += new CbGeneric(publisher_SomeEvent);
        }

        void publisher_SomeEvent()
        {
            //处理事件
        }

        public void Dispose()
        {
            //取消预订
            this.publisher.SomeEvent -= new CbGeneric(publisher_SomeEvent);
        }
    }

      特别是当预订者是自定义的windows控件时(从Control类继承),我们可以在其自身的Disposed事件中,来取消对发布者的事件预订。当包含该控件对象的宿主Form被关闭时,控件对象也会被释放,这可能是一个很隐蔽的问题,以至于我们忘了在控件被释放时取消必须的事件预订。

      我们也许想到,如果发布者与预订者的生命周期是完全相同的,是不是就不需要取消预订了?大多数情况下是可以的,但是你要保证你的发布者对象在被释放后,是否还被其他的对象持有引用,这样也可能会导致内存泄露以及其他问题。所以,我们建议,既然预订了事件,就请在预订者被释放时,取消这些预订。

 

 

 

 

时间: 2024-10-17 22:42:29

铁血规则:事件预订与取消预订的相关文章

jQuery 文本框事件绑定与取消代码

jquery 绑定事件 目前1.7以上,jquery的事件绑定已经用on替换了原来的bind: 区别:(个人理解)bind是一次绑定事件到每一个子节点:on是只绑定到父节点,然后冒泡到各个子节点: 用法:bind  代码如下 复制代码 一个事件,一个方法:$(".class input").bind('click',function(e){...;e.stopPropagation;}) 两个事件,一个方法:$(".class input").bind('click

奥斯卡奖大刀阔斧改规则最佳歌曲奖或取消

两天前,美国电影艺术与科学学院(Academy of Motion Picture Arts and Sciences)通过了将最佳影片提名数增加到10部的提议,引发了不小的震动,然而这只是学院一系列大刀阔斧改革的开始,今天学院又宣布他们将对最佳歌曲奖和终身成就奖"动刀". 据介绍,最佳歌曲奖修改后的评奖规则更为严苛,在提名阶段,如果没有任何一首歌曲的平均分达到8.25,那么这一年的最佳歌曲奖就会取消:如果只有一首歌分数达到8.25,那么这首歌和那首分数仅次于它的歌(2首歌)将获得提名

Dreamweaver实现客房预订业务系统

dreamweaver 客房预订业务的特点是顾客流动性大,其用户注册方式更为灵活,预订业务除了常用的验证外,还要防止在预订满的情况下继续预订客房.本实例将为读者介绍如何实现客房预订业务. 效果说明 图 96-1 所示是预订业务的基本界面,用户可以直接登录或注册并预订客房. 创作构思 通过程序检测用户是否成功登录,登录错误的是否能够注册成功,并添加用户的预订资料.通过" DataTime "类下的" Compare ",将用户预订的时间与其他用户已预订的时间进行比较,

抢米网推出“未过期域名预订”功能

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 每天都会有过期域名被删除,而当中夹杂的优质域名也是域名投资者必争之地."若手上没有好域名,怎敢称自己是域名投资者"?在域名投资行业,好域名数量的多寡,成为衡量域名投资者身价和资质的标杆.那么投资者该如何抢占先机,赢在起跑线上?不少投资者通过"域名预订"功能,预订即将到期的域名,但也有投资者表示由于一时疏

同程网发布新版APP新增自助游预订

9月4日,同程网发布了新版APP--"同程旅游5.1.4",新增了自助游预订和酒店团购两项业务,并进一步强化了语音搜索功能.在本次APP升级中,同程网首次推出了自助游产品的移动预订服务,目前其移动旅游预订服务由酒店预订.机票预订.景点门票预订和自助游预订四大业务板块构成,同时还包含了旅游攻略和航班/列车时刻查询两个资讯板块.在新版APP中增加自助游预订业务凸显了同程网全面发展自助游的战略布局.具体的功能上,本次升级主要强化了语音搜索功能,同时还新增了地图页面任意点找酒店功能.今年六月份

大众点评餐厅预订打通支付

摘要: 大众点评客户端商家支付 3月12日上午消息,大众点评对外透露,其战略重点产品餐厅在线预订已打通多款支付产品,这也是国内首个能够实现支付功能的餐厅预订产品,预订到店的用户 大众点评客户端商家支付 3月12日上午消息,大众点评对外透露,其战略重点产品"餐厅在线预订"已打通多款支付产品,这也是国内首个能够实现支付功能的餐厅预订产品,预订到店的用户在消费后可选择通过微信支付或支付宝买单. 据悉,打通支付使得大众点评从线上查询信息.提交预订到支付形成了完成的闭环,预订业务也由间接的佣金转

2011年第三周网游预订排行出炉《七龙珠》黑马夺魁

今日2011年第三周网游预订排名发布,榜上游戏排名发生较大的变化. 本周两款韩国新游<七龙珠><TERA>新开启预订以后火速占领第一第二名的位置.<TERA>在周一开放预订,最后以57706的预订数第二.而<七龙珠>周二才开启了激活码预订,旦由于游戏题材改编自众所周知的著名同名漫画,于是吸引来了大批的玩家,关注度直线上升,仅仅3天时间就超过了榜上所有的热门游戏,以7万多的预订数登上第一名. 全球首款暗黑类型网游<神鬼世界>本周排名第三,除了之前的

京津冀将统一电话预订火车票

在京沪高铁开通前,除了网络订票外,旅客将获得一个新的购票方式.昨天,记者从北京铁路局获悉,北京铁路局将推出自助语音电话订票系统,市民拨打95105105,便可预订开车前3日以及在预售期内的所有车次火车票.电话订票成功后,如超过24小时不取票,视为放弃. 电话订票首次跨越省市 北京铁路局有关负责人介绍,新的电话订票系统采用自助语音系统,没有人工干预.开通后,北京铁路局管辖内的北京市.天津市.河北省全境及山西省阳泉市.山东省德州市的市民,均可拨打订票电话95105105预订火车票. 这将是北京铁路局

苹果iPad广州接受预订售价或高达4999元

新快报讯苹果iPad将于本月在全球上市,目前广州已有苹果经销商推出iPad预订服务,消费者只要缴纳2000元预订金,便能在3月25日苹果 iPad全球上市后第一时间拿到现货.而部分苹果经销商预计,苹果iPad 16GB行货售价将高达4999元人民币,比美国499美元(约3400元人民币)的价格高出不少. iPad国内售价不低 据了解,苹果iPad将于本月25日在全球上市.记者发现,目前在苹果中国官方网站上已经出现了iPad的介绍信息,但尚未接受个人消费者预订:而广州市内部分苹果经销商则抢先提供消