C# 什么是【事件驱动】
事件驱动机、消息驱动对比
事件
按下鼠标,按下键盘,按下游戏手柄,将U盘插入USB接口,都将产生事件。比如说按下鼠标左键,将产生鼠标左键被按下的事件。
消息
当鼠标被按下,产生了鼠标按下事件,windows侦测到这一事件的发生,随即发出鼠标被按下的消息到消息队列中,这消息附带了一系列相关的事件信息,比如鼠标哪个键被按了,在哪个窗口被按的,按下点的坐标是多少?如此等等。
1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu.
2.再说什么是事件驱动的程序。一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。
3.事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。
4.事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。
5.事件驱动的程序,还有一个最大的好处,就是可以按照一定的顺序处理队列中的事件,而这个顺序则是由事件的触发顺序决定的,这一特性往往被用于保证某些过程的原子化。
6.目前windows,linux,nucleus,vxworks都是事件驱动的,只有一些单片机可能是非事件驱动的。
事件模式耦合高,同模块内好用;消息模式耦合低,跨模块好用。事件模式集成其它语言比较繁琐,消息模式集成其他语言比较轻松。事件是侵入式设计,霸占你的主循环;消息是非侵入式设计,将主循环该怎样设计的自由留给用户。如果你在设计一个东西举棋不定,那么你可以参考win32的GetMessage,本身就是一个藕合度极低的接口,又足够自由,接口任何语言都很方便,具体应用场景再在其基础上封装成事件并不是难事,接口耦合较低,即便哪天事件框架调整,修改外层即可,不会伤经动骨。而如果直接实现成事件,那就完全反过来了。
C# 什么是【事件驱动】相关推荐
- 由Node.js事件驱动模型引发的思考
引言 近段时间听说了Node.js,很多文章表述这个事件驱动模型多么多么优秀,应用在服务器开发中有很大的优势,本身对此十分感性去,决定深入了解一下,由此也引发了一些对程序设计的思考,记录下来. 什么是 ...
- 微服务系列(五):事件驱动的数据管理
编者的话|本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块 ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 1 简单的启动线程语法 2 def run(na ...
- golang-实现自己的事件驱动
golang实现自己的事件驱动 众所周知,go中的异步操作都已经封装在了运行时的过程中,有关socket的网络的异步操作都封装到了go的netpoll中,从而简化了编程形式.本文也就根据evio库总结 ...
- 网关技术选型,为什么选择 Openresty ?事件驱动、协程...
今天跟大家聊下关于网关的话题 互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面: 数据量过大,如何定制化存储 访问量高了,如何集群化部署,流量负载均衡 响应速度慢了,如 ...
- android 事件驱动编程,跟我学android之四 事件驱动模型
Android事件驱动模型需要深刻学习和理解,事件驱动模型三要素如下: 事件驱动模型事件源:事件的制造者,如:按钮通常会拥有注册和取消监听器的功能监听器:事件的接收者,通常是自己编写的类的对象一个实现 ...
- java事件驱动模型_Spring事件驱动模型详解
事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点:首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): 当 ...
- 【本人秃顶程序员】使用Spring Cloud Stream和RabbitMQ实现事件驱动的微服务
←←←←←←←←←←←← 快!点关注 让我们展示如何使用Spring Cloud Stream来设计事件驱动的微服务.首先,Spring Cloud Stream首先有什么好处?因为Spring AM ...
- Redis事件驱动库转
本文转自:http://www.cnblogs.com/wankaizhang/archive/2010/12/27/1918111.html 事件驱动的编程方式已经很普及了,原因自然是互联网的疾速膨 ...
- (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)决了当时的问题,那时LZ接触JAVA刚几个月,比葫芦画瓢的用了观察者模式。...
本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目中有可能用到的设计模式,即观察者模式. 说起观察者模式,LZ还是非常激动的,当初这算是第一个让LZ感受到设计模式强大的家伙.当初LZ要做一个 ...
最新文章
- eplan和西门子plc的对接_玩转西门子全集成自动化之TIA Selection Tool
- windows python MySQL-python安装过程
- leetcode算法题--买卖股票的最佳时机 II
- 开发者成功使用机器学习的十大诀窍
- Android开发实例之多点触控程序
- 端午将至……想和程序猿Coding个粽子行不行?
- 1.关于python
- 开始 Scrum 3: Values of Scrum
- docker多个容器一起打包_如何实现多个docker容器同时执行一条命令?
- 【转】socket提交http表单 [C++]
- JavaWeb项目自动部署,持续集成
- 微信名片、公众号二维码美化生成器!
- 为什么计算机软件比一般作品较多,插画-从入门到进阶的小心得
- arcgis发布服务后符号字体丢失解决办法
- python 使用 python-socketio 400 错误
- ROCBOSS开源微社区轻论坛类源码
- [1-3] 把时间当做朋友(李笑来)Chapter 3 【提高心智,和时间做朋友】 摘录
- 微信麻将连接服务器失败,微乐麻将授权失败是怎么回事?微乐麻将怎么用微信登录?...
- 三分钟了解LAP Framework编程框架
- 用python自动发微博
热门文章
- 考研计算机网络比较难还是数据结构,2015考研:历年计算机试卷结构与难度分析...
- Kafka 安装和搭建 (一)
- GitLab 自动触发 Jenkins 构建
- 好文推荐 | 分布式锁用Redis好,还是Zookeeper好?
- 如何构建一套高性能、高可用性、低成本的视频处理系统?
- 详解MySQL基准测试和sysbench工具
- 面试官:new一个对象的过程中发生了什么
- 面试官问,为什么建议MySQL列属性尽量用 NOT NULL ?
- JAVA线程间协作:Condition
- 打造极致体验:字节跳动亿级 DAU 背后的音视频技术最佳实践