栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何确保事件仅订阅一次

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何确保事件仅订阅一次

如果您要在可以访问源代码的类上谈论事件,则可以将防护措施放置在事件定义中。

private bool _eventHasSubscribers = false;private EventHandler<MyDelegateType> _myEvent;public event EventHandler<MyDelegateType> MyEvent{   add    {      if (_myEvent == null)      {         _myEvent += value;      }   }   remove   {      _myEvent -= value;   }}

这样可以确保只有一个订阅者可以在提供事件的类的该实例上订阅事件。

编辑, 请查看有关以上代码为何是一个坏主意而不是线程安全的注释。

如果您的问题是客户端的单个实例进行了多次订阅(并且您需要多个订阅者),则客户端代码将需要处理该问题。所以更换

尚未订阅

第一次订阅该事件时会设置的客户端类的布尔成员。

编辑(接受后): 根据@Glen T(问题的提交者)的评论,他所接受的解决方案的代码在客户端类中:

if (alreadySubscribedFlag){    member.Event += new MemeberClass.Delegate(handler);}

其中yetSubscribedFlag是客户端类中的成员变量,该成员变量跟踪对特定事件的首次订阅。人们在这里查看第一个代码段时,请注意@Rune的注释-
以一种非显而易见的方式更改订阅事件的行为不是一个好主意。

编辑31/7/2009: 请参阅@Sam
Saffron的评论。正如我已经说过的,Sam同意这里介绍的第一种方法不是修改事件订阅行为的明智方法。该类的使用者需要了解其内部实现,以了解其行为。不大好。
@Sam
Saffron还评论了线程安全性。我假设他指的是可能的竞争状况,其中(接近)两个订户同时尝试订阅,他们可能都最终订阅了。可以使用锁来改善这一点。如果您打算更改事件订阅的工作方式,则建议您阅读有关如何使订阅的添加/删除属性线程安全的信息。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573237.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号