1、 什么是事件?

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。

C# 中使用事件机制实现线程间的通信。

2、 事件与委托的关系是什么?

事件是一种特殊的委托的实例,或者说是受限制的委托,是委托一种特殊应用,在类的外部只能施加+=,-=操作符,二者本质上是一个东西。

3、 事件发生的类(事件发生器)的主要内容与作用?

发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。

4、 事件接收处理的类的主要内容与作用?

订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。

5、 什么是订阅事件 ?

定义对象间的一种一对多的依赖关系,当一个主题对象的状态发生改变时, 所有监听它的观察者对象都得到通知并被自动更新。

6、 如何引发事件?

1.创建一个委托

2.将创建的委托与特定事件关联

3.编写事件处理程序

4.利用编写的事件处理程序生成一个委托实例

5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件

7、 实现一个捕获键盘按键的程序,该程序包括 KeyEventArgs KeyInputMonitor EventReceiver

using System;
using System.Windows.Forms; namespace WindowsFormsApp01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} //(EventArgs是包含事件数据的类的基类)
internal class KeyInformationEventArgs : EventArgs
{
//字段
private char _keyChar;
public KeyInformationEventArgs(char keyChar) : base()
{
this._keyChar = keyChar;
}
//属性
public char KeyChar
{
//只读属性,只有get,无set
get
{
return _keyChar;
}
} }
//创建一个事件发生的类KeyInputMOnitor(这个类用于监控文本框的输入并触发一个事件)
internal class KeyInputMonitor
{
//创建委托,返回类型为void,两个参数
public delegate void KeyInputHandler(Object sender, KeyInformationEventArgs e);
//定义事件 //将创建的委托和特定事件关联,在这里特定事件为InputKeyInformation
public event KeyInputHandler InputKeyInformation; public void Run(string response)
{
char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
switch (responseChar)
{
case 'X':
//得到按键信息的参数
KeyInformationEventArgs KeyEventArgs1 = new KeyInformationEventArgs(responseChar);
//触发事件
//委托指定事件处理方法 去 处理事件。这就是 事件接收方 的类的事情了
InputKeyInformation(this, KeyEventArgs1);//这一句是触发事件的语句,并将事件交由KeyInputHandler这个委托来处理
//参数this是指触发事件的对象就是本身这个对象,KeyEventArgs包含了按键信息 break;
case 'Y':
KeyInformationEventArgs KeyEventArgs2 = new KeyInformationEventArgs(responseChar);
InputKeyInformation(this, KeyEventArgs2);
break;
default:
MessageBox.Show("没有触发事件");
break; }
}
}
//创建一个事件接收方(订阅者)的类
//这个类先产生一个委托实例。
//再把这个委托实例添加到产生
internal class EventReceiver1
{
/// <summary>
/// 定义一个方法
/// 当事件发生时实际执行的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnInputKeyInformation(object sender, KeyInformationEventArgs e)
{
//真正的事件处理函数
string result = string.Format("Key information:{0}", e.KeyChar);
MessageBox.Show(result);
}
/// <summary>
/// 订阅事件(注册)
/// 将事件接收方类EventReceiver与产生事件的类KeyInputMonitor关联起来
/// </summary>
/// <param name="monitor"></param>
public EventReceiver1(KeyInputMonitor monitor)
{
//订阅(注册)事件
//产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
monitor.InputKeyInformation += new KeyInputMonitor.KeyInputHandler(this.OnInputKeyInformation);
} }
internal class EventReceiver2 {
private void OnInputKeyInformation(object sender, KeyInformationEventArgs e)
{
//真正的事件处理函数
string result = string.Format("{0}花", e.KeyChar);
MessageBox.Show(result);
}
public EventReceiver2(KeyInputMonitor monitor)
{
//订阅(注册)事件
//产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
monitor.InputKeyInformation += new KeyInputMonitor.KeyInputHandler(this.OnInputKeyInformation);
}
}
//按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
//实例化一个事件发送器
KeyInputMonitor monitor = new KeyInputMonitor();
//实例化一个事件接收器
EventReceiver1 er = new EventReceiver1(monitor);
EventReceiver2 er2 = new EventReceiver2(monitor);
//引发事件运行
monitor.Run(tb1.Text.Trim());
}
}
}

【C#】【平时作业】习题-12-事件的更多相关文章

  1. 第二章 Vue快速入门--12 事件修饰符的介绍

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  2. Android View事件机制 21问21答

    原文: http://www.cnblogs.com/punkisnotdead/p/5179115.html#3358859 1.View的坐标参数 主要有哪些?分别有什么注意的要点? 答:Left ...

  3. JavaScript--DOM事件(笔记)

    第1章 事件流1-1.事件冒泡:事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收; 然后逐级向上传播至最不具体的那个节点(文档);1-2.事件捕获:不太具体的节点应该更早接收到事件,而最具 ...

  4. DDD事件总线

    DDD事件总线 基本思路: (1)       在事件总线内部维护着一个事件与事件处理程序相映射的字典. (2)       利用反射,事件总线会将实现了IEventHandler的处理程序与相应事件 ...

  5. DOM事件代码小结

    以下代码出自<DOM Enlightenment>一书1.三种事件形式 <body onclick="alert('触发内联属性事件')"> <div ...

  6. c#命名规范汇总12条

    前言 在刚学习c#的时候,在脑子根本就么有命名规范这个概念,有了一定入门的基础,也很难严格要求自己去规范代码的命名,工作后,发现自己的命名和其他人的命名总会有一些出入,总会闹出一些尴尬的笑话,这里汇总 ...

  7. JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!

    摘要: 深度理解JS事件循环!!! 原文:JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式! 作者:前端小智 Fundebug经授权转载, ...

  8. 浏览器根对象window之事件

    1. [事件]动画 onanimationstart onanimationend onanimationiteration onwebkitanimationend onwebkitanimatio ...

  9. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  10. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

随机推荐

  1. ptmalloc、tcmalloc与jemalloc对比分析

    背景介绍 在开发微信看一看期间,为了进行耗时优化,基础库这层按照惯例使用tcmalloc替代glibc标配的ptmalloc做优化,CPU消耗和耗时确实有所降低.但在晚上高峰时期,在CPU刚刚超过50 ...

  2. 三维医学图像数据扩充:flip and rotate

    对于小数据量医学图像进行深度学习使,会由于数据量过小而过拟合.因此我们需要采用数据扩充方法,而flip和rotate又是经常用到的,这里做一个简单的实现. 输入为[batchsize,height, ...

  3. Android复习(三)清单文件中的元素——>uses-configuration、uses-library、uses-permission、uses-permission-sdk-23

    <uses-configuration> 语法: <uses-configuration android:reqFiveWayNav=["true" | &quo ...

  4. WebAssembly 基础以及结合其他编程语言

    0x00 WebAssembly 基础 详情参考<WebAssembly | MDN> (1)概述 WebAssembly 简称 WASM 或 WA,是一种新的编码方式,可以在现代的 We ...

  5. flink同步MySQL数据的时候出现内存溢出

    flink同步MySQL数据的时候出现内存溢出 背景:需要将1000w的某类型数据同步到别的数据源里面,使用公司的大数据平台可以很快处理完毕,而且使用的内存只有很少很少量(公司的大数据平台的底层是fl ...

  6. KubeSphere v4 开源并发布全新可插拔架构 LuBan

    2024 年 10 月 10 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere v4(开源版)已正式发布,同时发布全新可插拔架构 KubeSphere LuBan. 相较于 K ...

  7. 运营商业务系统基于 KubeSphere 的容器化实践

    本篇文章是 KubeSphere 2020 年度 Meetup 上讲师宋磊分享内容整理而成. 大家好,我是宋磊,在运营商的一个科技子公司任职,主要做大数据业务.我主要负责公司的 IaaS 层和 Paa ...

  8. python多线程应用-批量下载视频课程(宠医堂)

    #!/usr/bin/env python # -*- coding: UTF-8 -*- ''' @Name: cyt_record_download @IDE:PyCharm @Author:qt ...

  9. css常用布局之flex布局

    Flexbox 是一个一维的布局模式,它可以轻松地在不同的方向上排列子元素(称为 flex 项),即使它们的大小是未知或者是动态变化的.以下是 Flexbox 的一些关键概念: 容器和项: 启用 Fl ...

  10. Solon Ioc 的魔法之注解注入器(也可叫虚空注入器)

    很多人惊叹于 Solon 的注入能力,一个注解怎可注万物??? 一.注解注入器 Solon Ioc 的四大魔法之一:注解注入器(BeanInjector<T extends Annotation ...