问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

.net事件驱动和过程驱动2种运行机制的本质区别

发布网友 发布时间:2022-04-27 11:44

我来回答

2个回答

懂视网 时间:2022-04-27 16:05

本文实例分析了.NET事件监听机制的局限与扩展。分享给大家供大家参考。具体分析如下:

.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异。
代码如下:// C#
someButton.Click += OnSomeButtonClick;
代码如下:// Java
someButton.addActionListener(
    new ActionListener(){
        public void actionPerformed(){
            ...
        }
});

在我们的软件中就大量使用事件来对监听者与发布者解耦,但也遇到了一些局限,在这里跟大家分享一二。一是无法保证监听者的调用顺序;二是当监听者很多时的监听、解除监听的效率问题。
 
事件监听者的调用顺序

.NET的事件监听机制对监听者的调用顺序没有明确的保证,但有时我们却要求保证不同组件之间的处理顺序。比如,在我们的软件中使用类似解释器模式的方式来实现用户交互操作,一个称作交互源的组件负责将UI控件上的事件分派给一组称为交互器的组件,这些组件依照事先确定的优先级依次获得事件处理的机会,只有当具有高优先级的交互器没有处理事件时,低优先级的组件才能执行进一步的处理。这样,我们就能在不同业务功能的实现中通过以不同的顺序组织交互器来重用它们。比如,重用一些基本的视图缩放、平移、菜单处理等功能。
 
在上述场景下,如何保证交互器间事件处理的顺序就变得很重要了。当然如果你看一下MulticastDelegate的源代码的话,可以知道在当前的实现中其实各个监听者还是有一定的调用顺序的。但一来这属于实现细节,在将来完全可能改变;二来如果不同的监听器位于不同的模块中时,要依赖于这一实现而保证它们之间的调用顺序也是很困难的。
 
在这里我们借鉴了Java中以接口进行事件处理的方式,并在添加监听器的同时接收一个表示优先级的参数,这样就可以明确的维护各个监听器的顺序了,如下面的代码所示。我们在交互器(IInteractor)接口中为每一个UI事件定义了相应的方法,并且让InteractSource负责将控件上的事件转化为对接口中相应方法的调用。
代码如下:public class InteractSource
{
    public void AddInteractor(int priority, IInteractor interactor)
    {
    }
}
 
public interface IInteractor
{
    public void OnMouseDown(MouseEventArgs e)
    {
    }
   
    ... ...
}

监听器添加与移除的效率

MulticastDelegate是我们平常使用的事件(event)机制背后的实现,通过其源代码可以看到,它在内部使用数组保存了对各个监听器的引用。这就会造成一个问题——当对一个事件的监听器数目很多时,添加和移除监听器的效率将会变得非常低。以移除为例,对于有N个监听器的事件来说,平均要进行N/2次比较才能确定监听器的位置,而且还要有额外的数组整理操作。为了解决这一情况,我们先是尝试自行定义事件的添加、移除逻辑,并在内部尝试使用字典、哈希表等多种方式进行存储,但事实证明,虽然二者在时间复杂度上有优势,不过其实际效率还是达不到要求。
 
最好状态下是要有一种能在常数时间内添加和移除监听器的数据结构,也许你也想到了——双向链表。
 
也许你又想到了——在双向链表中添加和删除是常数时间,但查找却仍然是O(n)的复杂度。
 
使用接口形式的设计方式再次展现了其灵活性,我们可以将事件发布者的设计为如下形式(示意代码):
代码如下:public class EventSource
{
    private LinkedList list = new LinkedList();
 
    public Tocken AddListener(IEventListener listener)
    {
        LinkedListNode n = new LinkedListNode(listener);
        list.AddLast(n);
        return new Tocken(node);
    }
 
    public void RemoveListener(Tocken tocken)
    {
        list.Remoe(tocken.node);
    }
 
    public class Tocken
    {
        internal LinkedListNode node;
    }
}

在此类中使用双向链表存储已经添加的监听器,而在AddListener方法每次调用时都将所添加的链表节点保存到一个令牌(Token)中返回。监听者需要保存这个令牌,并使用它来解除监听。当然,监听者完全可以忽略令牌是个什么东西,就像地铁票从来就是只是一张票而已,我们不曾关心它包含着什么信息。不过对于发布者来说却可以将一些定位信息保存在其中,从而在解除监听时充分利用,在上面的代码中我就保存了链表节点的引用,从而达到监听者的添加、定位、移除都在常数时间内完成。
 
当然,还可以在Tocken中保存发布者的引用,这样就可以发现”取消对一个从来没有监听过的对象的监听“这样的BUG。或者,还有其它信息。

希望本文所述对大家的C#程序设计有所帮助。

热心网友 时间:2022-04-27 13:13

如果你写的是窗口或者web程序,那么一定是事件驱动的,如果写的是控制台程序,那么就是过程驱动的,其本质区别在于,过程驱动是程序一直在走代码,程序作出的一切反映都是你的代码做的,你没有调用过的代码,就算你写了,程序也不会执行到那里。但事件驱动则不同,程序是分块的,每块只对应一个事件,比如按钮按下事件的代码,你并没有在代码显式调用这段代码,但当你点击了按钮时,系统会自动走到那里。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
男生一般在15岁青春期心情不好大多是什么造成的 我今年15岁男生为什么会经常做那些难以启齿的梦? 男生的青春期是几之几岁?我今天十四岁半,是青春期吗? 怎么看别人加密的qq空间相册内容单独删除相册里的人聊天记录方法 win11怎么退出微软账户-windows11微软账户退出教程 windows11微软账户怎么退出 windows11退出微软账户教程 windows11怎么退出账号登录 windows11退出账号登录教程 高尔夫雾灯怎么打开? 新车上牌照流程 新车自己怎么上牌照 新车上牌的流程有哪些 手机怎样清理垃圾文件 手机微信里的清理旧文件功能会清掉什么东西? 手机文件如何清理 c#.net监听事件 苹果4S好用吗? 苹果4S好吗? 2017苹果4s花五百买合适吗6的版本 苹果4s还值得买吗 苹果4S现在有入手的必要吗?是不是已经落后 苹果4s就那么垃圾吗? iphone4s用到2017年可以吗 2015年用苹果4丢人吗? 苹果4S过时了吗? 现在还用苹果4S的话,还有意义吗,4S现在还能用吗 2017年了苹果4s还值得买吗?买的话支持的软件多吗,用起来会不会卡 2017年苹果4s还值得买吗 2017年苹果4s会淘汰吗 现在都有苹果7啦 用4s是不是很丢人。本人初中生,感觉在同学面前拿不 苹果4s现在还能用吗?同学们都用什么oppo vivo的现在用苹果4还丢脸吗 现在用苹果4s丢人吗? 求一篇大学生美术考古论文。。。 诚意请教(考古) 顾平的学术成果 想考苏州大学中国美术考古及艺术设计史博士,不知道这个专业怎么样,好不好考,参考书目是什么.谢谢 考古中国的论文写什么好呢? 急、、、 棉鞋得白色毛毛被裤子染色怎么去除 在电脑上直接运行u盘中大于4g的游戏对u盘有损害吗? u盘无法拷贝大于4g的文件,应该怎么办 fat32的u盘可以在u盘里面安装大于4G的游戏吗不是复制啊 U盘不能拷贝4G以上的游戏? 这些天吃饭都没什么胃口,有什么简单的开胃菜吗? 夏季清淡饮食(没菜谱,不给分) 中国船舶信息中心(714所)待遇,发展前途,怎么样? 中船重工714所,搞舰船情报研究的,我博士毕业,人家让过去面试,这个所待遇和发展怎么样? 什么是军工产业公司呀?南京熊猫714厂是军工产业公司么?714厂本科生进去工资待遇怎么样呀?具体点 中国船舶信息中心(北京714所)待遇,发展前途,怎么样? 南京燕子矶有个军工厂叫714厂吗? 中船重工714所,如何啊?急!! 各位,中船重工714所怎么样啊?希望有了解的朋友介绍下情况各方面情况 关于netbeans中 事件监听等方面的问题。 什么是三维向量,什么是二维向量?
  • 焦点

最新推荐

猜你喜欢

热门推荐