C#事件(event)解析

【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(下篇) 【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配! 阅读详情
事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。而这些东西却往往又是编程中常用且非常重要的东西。大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。 
      先来看看事件编程有哪些好处。 
      在以往我们编写这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测某些判断变量,而引入事件编程后,大大简化了这种过程: 
      - 使用事件,可以很方便地确定程序执行顺序。 
      - 当事件驱动程序等待事件时,它不占用很多资源。事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。如果没有消息在等待,则程序会把控制交回给操作系统,以运行其他程序。 
      - 事件简化了编程。操作系统只是简单地将消息传送给对象,由对象的事件驱动程序确定事件的处理方法。操作系统不必知道程序的内部工作机制,只是需要知道如何与对象进行对话,也就是如何传递消息。 
  有了这么多好处,看来我们的确有必要掌握它。俗话说:“难了不会,会了不难”。就让我们一步一步开始吧... 
  要讲事件,必然要讲到委托(delegate)。它们之间的关系可以通过一个浅显的比方来说明,这个比方可能不是十分恰当。比如你要租一个房屋,这是一个事件,那么委托就是房屋租赁中介,当你把租房子的消息告知中介后,中介就会产生出一套符合你要求的房屋租赁方案来。再由中介执行这套方案,你便租得了这个房屋,即事件被处理了。当然你也可以不通过中介,直接找房东,但如果没有互联网等工具,你如何得到谁出租房屋的信息?话题扯远了。 
委托(delegate) 
      委托可以理解成为函数指针,不同的是委托是面向对象,而且是类型安全的。关于委托的理解,可以参考我的另一篇文章《C#委托之个人理解》。 
事件(event) 
  我们可以把事件编程简单地分成两个部分:事件发生的类(书面上叫事件发生器)和事件接收处理的类。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个个对象或方法将会加收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们需要有一个处理事件的方法。好了,我们就按照这个顺序来实现一个捕获键盘按键的程序,来一步一步说明如何编写事件应用程序。 
1、首先创建一个自己的EventArgs类。 
      引自MSDN: 
      EventArgs是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。 
因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,来保存按键信息,好让后面知道按了哪个键。 
internal class KeyEventArgs : EventArgs 
{ 
    private char keyChar; 
    public KeyEventArgs( char keyChar ) : base() 
    { 
        this.keyChar = keyChar; 
    } 
    public char KeyChar [Page]
    { 
        get 
        { 
            return keyChar; 
        } 
    } 
} 
2、再创建一个事件发生的类KeyInputMonitor,这个类用于监控键盘按键的输入并触发一个事件: 
internal class KeyInputMonitor 
{ 
    // 创建一个委托,返回类型为void,两个参数 
    public delegate void KeyDown( object sender, KeyEventArgs e ); 
    // 将创建的委托和特定事件关联,在这里特定的事件为OnKeyDown 
    public event KeyDown OnKeyDown; 
    public void Run() 
    { 
        bool finished = false; 
        do 
        { 
            Console.WriteLine( \"Input a char\" ); 
            string response = Console.ReadLine(); 
            char responseChar = ( response == \"\" ) ? ’ ’ : char.ToUpper( response[0] ); 
            switch( responseChar ) 
            { 
                case ’X’: 
                    finished = true; 
                    break;
                default: 
                    // 得到按键信息的参数 
                    KeyEventArgs keyEventArgs = new KeyEventArgs( responseChar ); [Page]
                    // 触发事件 
                    OnKeyDown( this, keyEventArgs ); 
                    break; 
            } 
        }while( !finished ); 
    } 
} 
      这里注意OnKeyDown( this, KeyEventArgs );一句,这就是触发事件的语句,并将事件交由KeyDown这个委托来处理,委托指定事件处理方法去处理事件,这就是事件接收方的类的事情了。参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息。
3、最后创建一个事件接收方的类,这个类先产生一个委托实例,再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。然后提供一个方法回显按键信息。 
internal class EventReceiver 
{ 
    public EventReceiver( KeyInputMonitor monitor ) 
    { 
        // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中 
        monitor.OnKeyDown += new KeyInputMonitor.KeyDown( this.Echo ); 
    } 
    private void Echo(object sender, KeyEventArgs e) 
    { 
        // 真正的事件处理函数 
        Console.WriteLine( \"Capture key: {0}\", e.KeyChar ); 
    } 
} 
4、看一下如何调用 
public class MainEntryPoint 
{ 
    public static void Start() 
    { 
        // 实例化一个事件发送器 
        KeyInputMonitor monitor = new KeyInputMonitor(); 
        // 实例化一个事件接收器 
        EventReceiver eventReceiver = new EventReceiver( monitor ); 
        // 运行 
        monitor.Run(); 
    } [Page]
}
总结: 
C#中使用事件需要的步骤: 
      1.创建一个委托 
      2.将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名) 
      3.编写事件处理程序 
      4.利用编写的事件处理程序生成一个委托实例 
      5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件 
C#中事件产生和实现的流程: 
      1.定义A为产生事件的实例,a为A产生的一个事件 
      2.定义B为接收事件的实例,b为处理事件的方法 
      3.A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件) 
      4.A通过事件列表中的委托对象将这个事件通知给B 
      5.B接到一个事件通知(实际是B.b利用委托来实现事件的接收) 
      6.调用B.b方法完成事件处理
无人机:DJI Matrice 200 Series_(13).行业应用案例分析 在前一节中,我们介绍了DJI Matrice 200系列无人机的基本硬件配置和性能参数。本节将通过具体的行业应用案例,分析如何利用DJI Matrice 200系列无人机进行二次开发,以满足不同行业的需求。 阅读详情

相关推荐

10位PWM能否满足电梯±5mm平层精度?4位扩展法让10位PWM达到14位精度

电梯平层精度直接关系乘坐舒适性与安全性,而PWM分辨率是决定精度的关键因素之一。10位PWM能否满足±5mm的平层精度要求?本文从分辨率与物理量的对应关系出发,结合工程精度需求与实战对比,给出明确的选型结论与解决方案,请参考优快云博客《4位扩展法:基于ATtiny816的高精度PWM软件扩展方法》和《低成本高精度PWM:4位扩展法原理、实现和工程实践》。10位PWM的分辨率为 $2^{10} = 1024$ 级。

m0_73354873的博客 244

C#等待事件触发(类似WaitForSingleObject())_线程

1、c# 等待事件触发 类似c++的WaitForSingleObject()_百度知道.html(https://zhidao.baidu.com/question/1539843583632581347.html) ManualResetEvent mre = new ManualResetEvent(false); // 你的线程 private void MyTh...

weixin_30786657的博客 2679

android OTA升级之后,apk崩溃无法启动

也就是说,我们这个高低版本是fingerprint相同的情况,这个问题追述到jenkins编译,启动job时会初始化一个BUILD_NUMBER值,这个值正好跟Android的build系统的名称重复,这就导致Android build系统那一套拼接时间戳的值不会走,因为jenkins一启动就会定义该值,而我们jenkins服务器迁移过,这个值又会从1开始累计,导致前后版本都是16,从而导致fingerprint一致。问题背景:系统版本从低版本升级到高版本后,apk崩溃启动失败。硬件平台:QCS6125。

kevin's cache的专栏 1347

C#事件的引发与等待

原则:1、一段代码中引发了一个事件,那么所有注册了这个事件的对象,它们的事件处理程序都会执行起来,而且引发事件的这个类(发送器端)的执行会暂时停了,等待其他所有的类的事件处理程序完成之后再继续执行。      一个程序之中,几个对象之间如何传递交互信息,便是这样执行。      这个过程类似于C中的消息传递,一个模块(一段代码)发送一个消息sendmessage,这个消息由系统获知,其

todototry的专栏 4478

Autosar软件组件分析及ARXML文件分析

Autosar软件组件分析及ARXML文件分析

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3601

MTK Meta ISP 工具使用技巧与参数读取路径全解析

在联发科(MediaTek, MTK)平台上进行相机图像调试时,Meta ISP 工具是连接 PC 与设备进行参数调整、寄存器读取和图像输出的重要工具。本文以实战角度出发,系统梳理 Meta ISP 的使用流程、关键模块功能、典型调试技巧与参数读取路径,结合最新版平台(如MTK Genio/Dimensity 系列)架构,帮助工程师掌握联发科图像调优的核心流程。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1148

C#多线程同步事件及等待句柄

最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading.WaitHandle.WaitOne 、System.Threading.WaitHandle.WaitAny和System.Threading.Wait

wangqiuyun的专栏 3万+

【笔记】1.1 拉伸力-伸长(延伸)曲线和应力-应变曲线

过了B点后,由于颈缩导致的截面半径迅速减小,导致真应力迅速上升,切线斜率明显提高。假设试样原长为ε,在力的作用下伸长了dε,那么根据应变的定义,瞬时的应变为dε/ε,总的应变为瞬时应变的累计,假设在瞬时的条件下,试样受载荷变化量为 ΔF ,变化的截面积为 ΔA ,而且ΔA→0,那么瞬时的。由于原始的截面积和原始的标距长度为常数,故得到的曲线长相和拉伸力-伸长(延伸)曲线没啥区别。因为用的都是原始的截面积和原始的标距长度,故称为公称应力和公称应变。如果拉伸力→应力,伸长长度→应变,就会得到应力-应变曲线。

m0_73676887的博客 5270

C#事件到可等待模式

在本提示中,您将了解如何将基于事件的“旧” API调整为完全现代的基于任务的API。

寒冰屋的专栏 333

HQChart实战教程54:Renko砖形K线图实现详解

Renko图(砖形图)起源于日本,只关注价格变动而忽略时间和成交量因素: 2.2 算法说明 初始化:使用第一根K线的收盘价创建第一个砖块 变动检测:计算当前价格与最后一个砖块的差值 砖块生成: 当价格变动≥砖块大小时,生成新砖块 当价格变动不足时,更新当前砖块的高低价 方向判断:根据价格变动方向确定砖块颜色 三、完整实现代码 四、Renko图的高级应用 4.1 动态砖块大小调整 4.2 Renko交易策略 三砖反转策略:趋势跟踪策略:本文详细介绍了Renko图的实现原理和在HQChart中的应

QQ_778132974的博客 873

【示波器专题】示波器探头的原理深入——有源探头之单端有源探头

由于接地环路的苛刻要求,更高带宽的单端有源探头就算设计了也不实用。因此单端有源探头的带宽一般在6GHz以内,更高带宽的信号测量也只能使用差分有源探头(市面上有些型号的差分探头可同时兼顾单端测试)。......

一点硬件 2146

C#事件(event)解析,委托(delegate)与事件(event)的关联

本篇文章非原创,是一位博客园的徐洪军,网名loose_went所写,我从中学到了很多,对于C#的事件(event)的理解也加深了很多,这篇文章值得写的很不错,所以放在这里相当于推广以及留着自己以后也可以看。文章无商用,如果侵犯到原作者的相关权利,我会立马删除 **事件(event):**这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。而这些东西却往往又是编程中常用且非常重要的东西。大家都知...

weixin_38778769的博客 658

FPGA 学习笔记:Vivado 配置IO引脚约束

FPGA 学习笔记:Vivado 配置IO引脚约束

坚韧与专注 2万+

c# 事件 event 解析

事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。而这些东西却往往又是编程中常用且非常重要的东西。大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。 先来看看事件编程有哪些好处。 在以往我们编写这类程序中,往往采用等待机制,为了等待某件事...

qq_37657601的博客 222

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# 事件(event)解析

转自:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html#2168843 大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。 在以往我们编写这类程序中,往往采用等待机制,为了等待某件

白永辉的专栏 676

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C#事件(event)解析[转]

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂。而这些东西却往往又是编程中常用且非常重要的东西。大家都知道windows消息处理机制的重要,其实C#事件就是基于windows消息处理机制的,只是封装的更好,让开发者无须知道底层的消息处理机制,就可以开发出强大的基于事件的应用程序来。     先来看看事件编程有哪些好处。    在以往我们编写这类程序中,往往采用等

某任的专栏 643

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: asp.net 2.0 缓存(页面输出缓存)
下一篇: Application, Session, Cookie, Viewstate, Cache对象用法、作用域和区别
mywebstudy
博客等级 码龄15年 30粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值