当前位置: 首页 > news >正文

哎呀哎呀哎呀~,我爱上了事件

哎呀哎呀哎呀~,我爱上了事件

左直拳

事件对我来说很神秘,不容易理解和掌握。

可是慢慢的用了几次后,认为很好用。我发觉我已经喜欢上它了。

让我们立即开始这段感情吧。

一、为什么要用事件?

第一个反应当然是想获得一个通知。就是说,我希望某个东西执行到某个步骤,就通知我,我好做点什么事情;最初VC里的事件给我的印象就是这样子的。当然C#里也有这样的功能。

第二个,预留一个空间让调用方来执行自己的东西。我目前做得最多的就是在写用户控件的时候,提供事件来让调用这些控件的程序在事件激发时处理自己特定的代码,这些代码是怎么样的,对控件本身来说完全不知情。

二、如何使用事件?

(一)ASP.NET应用

结合写控件来说明。

在用户控件里:

1、先声明一个委托

public delegate void ClickEventHandler(object sender, EventArgs e);

C#里,事件本质是一个委托。委托的作用是可以将函数或方法当作参数来使用。

2、再用这个委托声明一个事件E

public event ClickEventHandler MyClick;

3、然后在控件本身的事件中(例如某个按扭被点击)检查事件E是否有被引用,有就执行

protected void btnTest_Click(object sender, EventArgs e)

{

……

if (MyClick != null) MyClick(this, e);

}

这个执行,就是触发调用方的代码。

4、在调用方

页面代码:

<uc4:myCtrl ID="MyCtrl1" runat="server" OnMyClick="MyCtrl1_MyClick" />

注意这里是OnMyClick,多了一个”On”

服务器代码:

protected void MyCtrl1_MyClick(object sender, EventArgs e)

{

//HELLO WORLD

}

(二)WINFORM等常规程序应用

我搞了个东西使用了多线程,现在想所有的线程都执行完了以后,返回一个消息,好作些抹屁股的工作。

用事件。

public class PThreadInvoke

{

public PThreadInvoke()

{

……

//加入事件

CThreadDo.ThreadFinished += new CThreadDo.FinishEventHandler(CThreadDo_ThreadFinished);

}

//调用该事件的函数

void CThreadDo_ThreadFinished()

{

//HELLO WORLD

}

//类中类

class CThreadDo

{

public delegate void FinishEventHandler();

public static event FinishEventHandler ThreadFinished;

//所有线程执行完

public void ThreadIsOver()

{

……

//触发事件

if ( ThreadFinished != null)

{

ThreadFinished();

}

}

经过测试,事件跟全局静态变量差不多,比如说,就本例子来讲,这个线程不管是用户手工激发,还是用定时器每隔一段时间激发,都能收到ThreadFinish事件。比方说,这个程序一直在后台运行,定时器激发了线程;然后用户打开了界面,很显然,用户使用的实例PThreadInvoke 和定时器使用的PThreadInvoke 并非同一个,可是定时器开辟的线程完成之后,触发的ThreadFinished 事件,在用户使用的实例PThreadInvoke 里同样能收到。只要 if ( ThreadFinished != null) 都可以。

总结:

事件本质是一个委托。由调用方引用(+=),由被调用方触发。

好多东西我都没搞懂,写出来也不知道对不对。谨作总结备忘。

相关文章:

  • Gephi 网络可视化——设置节点颜色
  • 3个字节的空txt文本文件
  • 上班久坐族的福利
  • 微信朋友圈数据挖掘
  • Microsoft SQL Server事务日志的应用
  • 微信自动回复天气预报
  • linux下巧用tail命令 创建自解压tar文件
  • itchat 同时实现自动回复和定时任务
  • 恢复SQL2005误删除的数据
  • 国家地区标准代码(国际域名缩写)
  • 提高你的调试代码的效率
  • python 代码计时
  • 如何处理创建DB2工具目录数据库的时候遇到的SQL1005N错误?
  • pandas 查找数据
  • SUN发布JavaFX...
  • “大数据应用场景”之隔壁老王(连载四)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Asm.js的简单介绍
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • laravel with 查询列表限制条数
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • mysql外键的使用
  • Spring框架之我见(三)——IOC、AOP
  • Terraform入门 - 3. 变更基础设施
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 分享一份非常强势的Android面试题
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 机器学习 vs. 深度学习
  • 坑!为什么View.startAnimation不起作用?
  • 聊聊hikari连接池的leakDetectionThreshold
  • 深入浅出webpack学习(1)--核心概念
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (7)STL算法之交换赋值
  • (二)JAVA使用POI操作excel
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (实战篇)如何缓存数据
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net开发时的诡异问题,button的onclick事件无效
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @Bean注解详解
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @EnableWebMvc介绍和使用详细demo
  • @font-face 用字体画图标
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ JavaScript ] JSON方法