学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为3661,预计阅读10分钟

前言

上一篇发了一个视频,关于车辆通过系统的场景模拟,在这个项目中,主要想介绍一下使用中距离的读卡器对车辆上的RFID卡进行身份识别,其中读卡这块的核心就是用到了EventHandler的委托和线程的处理,看了一下原来的C#文章中,以前没有介绍过EventHandler的委托,所以这篇简单先介绍一下这个,后面的文章会结合EventHandler的委托和线程做一个模拟当时环境小Demo。

EventHandler简介

微卡智享

EventHandler就是一个事件处理器,将一个事件与处理事件的方法联系起来的一种机制。 说人话就是:我是小明,现在想邀请小红出去玩,小红说要吃完饭后才能出来。那原来设计这样的话,我需要定时去小红那看看她吃没吃完饭,这样一直等到她吃完后我们再一起出去,而采用EventHandler委托的话,就是吃饭的事小红自己处理,等吃完后他发送一个消息通知我吃完了,然后我们一起出去就行了。

EventHandler使用

# 说明
1 声明一个EventArgs的子类,传递参数
2 声明委托对象,执行方法,将方法绑定委托对象
3 开启EventHandler的委托

EventHandler实现

微卡智享

打开VS后新建了一个threaddemo的项目,这个项目Demo当线程一起讲了后我会发上来。

01

创建EventArgs子类

创建一个testEvent的子类,继承自EventArgs,然后定义了一个字符串和一个整数类型,用于记录返回一内容和当前的ID。

namespace threaddemo
{public class testEvent :EventArgs{public string datastr;public int id;public testEvent(string str,int id){datastr = str;this.id = id;}}
}

02

定义接口,写接口实现方法

新建一个inftest的接口,上面是用interface而不是class,定义了三个方法。

namespace threaddemo
{interface Inftest{event EventHandler<testEvent> DataReceived;void Stop();void Start();}
}

新建一个CTest的类,继承自Inftest

这个类主要是写了一个实现的方式,其中重写了start和stop的方法,及我们定义的DataReceived的的处理方式

CTest的代码

using System;
using System.Collections.Generic;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace threaddemo
{public class CTest : Inftest,IDisposable{public int id;private AutoResetEvent exitEvent;private Thread thread;private int waitTime = 100;private bool disposed = false;private bool IsRunning;public int cs = 0;public CTest(int _id){id = _id;exitEvent = new AutoResetEvent(false);thread = new Thread(ReadThreadRun);thread.IsBackground = true;}public event EventHandler<testEvent> DataReceived;public void Dispose(){// Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!this.disposed){if (disposing){try{Stop();}catch (Exception){}}disposed = true;}}public void Start(){IsRunning = true;thread.Start();}public void Stop(){IsRunning = false;exitEvent.Reset();exitEvent.Set();RaiseDataReceived("手动停止");}public void Reset(){exitEvent.Reset();exitEvent.Set();}public void setcs(int _cs){cs = _cs;}private void RaiseDataReceived(string msg){DataReceived?.Invoke(this, new testEvent(msg, id));}/// <summary>/// 接收线程/// </summary>private void ReadThreadRun(){while (IsRunning){try{if (exitEvent.WaitOne(waitTime)){if (IsRunning) {Thread.Sleep(1000);id++;if (id % 5 == 0){throw new Exception("余数:0");}else if (id % 5 == 1){try{throw new Exception("故意出错");}catch(Exception ex){RaiseDataReceived(ex.Message);Reset();}}RaiseDataReceived("状态:重启");}else{Thread.Sleep(1000);RaiseDataReceived("停止");}}Random rd = new Random();int count = rd.Next(0, 13);if (count < 10){RaiseDataReceived(count.ToString());   }else if (count == 10){throw new Exception("throw 数字:" + count);}else{RaiseDataReceived("数字:" + count + " Reset");Reset();}}catch (Exception ex){RaiseDataReceived("error " + ex.Message);Reset();}//Thread.Sleep(100);}}}
}

03

开启委托

在Form的主窗体代码中,定义好了CTest的类。

写一个DataReceived的触发事件。

        private void _test_DataReceived(object sender, testEvent e){try{TextShowNew(richTextBox1, e.datastr);int count = -1;try{count = Convert.ToInt32(e.datastr);}catch(Exception ex){count = -1;}if (count >= 0){CItem item = new CItem(0, count, "测试" + count, DateTime.Now);ht.checkHashTest(item, 5000);}if (!ht.checkDatetime(dtclear, 5000)){ht.RemoveHashTableFromTime(5000);dtclear = DateTime.Now;}}catch (Exception ex){TextShowNew(richTextBox1, ex.Message);}}

点击按钮初始化时,使用+=刚才定义的方法进行委托。

        private void Openinf(){try{if (_test != null){_test.Stop();_test.Dispose();}_test = null;_test = new CTest(idx);_test.DataReceived += _test_DataReceived;_test.Start();TextShowNew(richTextBox1, idx + "开启");idx++;}catch (Exception ex){TextShowNew(richTextBox1, "Error:" + ex.Message, 1);}}

完成上面这三步,我们的基本委托就可以实现了。

Demo运行效果

上面的Demo是整个运行的效果,下一篇我们讲线程的时候会整个讲一下这个Demo怎么用于模拟读卡器的运行情况。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

unity3D练习

笔记|C#腾讯云支付SDK遇到的问题及解决

分享|自己平时常用的几款效率工具

学习|C#的EventHandler的委托使用相关推荐

  1. 学习:C# 中的委托和事件(转)

    源码下载: http://www.tracefact.net/SourceCode/Delegates-and-Events-in-CSharp.rar 引言 委托 和 事件在 .Net Framew ...

  2. 学习|Unity3D使用协程实现减速停车效果

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4303字,预计阅读11分钟 前言 上一篇<学习|Unity3d的导航实现循环线路移动>讲了一下定制循环行驶路线的方 ...

  3. 学习|Unity3d的导航实现循环线路移动

    本文长度为2703字,预计阅读7分钟 前言 前阵子用Unity3d做的那个模拟收费的动画,主要是模拟了一个项目中的场景,让人看到更直观一些,最主要的目的还是最近在学习Unity3d,直接以实际项目应用 ...

  4. c#中的委托、事件、Func、Predicate、Observer设计模式以及其他

    原文地址:[学习笔记]c#中的委托.事件.Func.Predicate.Observer设计模式以及其他 参考资料: 1. 简单谈谈事件与委托 2. C#中的委托和事件(上) 3. C#中的委托和事件 ...

  5. 在.NET2.0中如何更简单的使用委托将方法加载到事件中去

    我们知道在System命名空间中,.NET为我们提供了EventHandler的委托,它的原型是delegate void EventHandler(object sender,EventArgs e ...

  6. C#中StreamWriter与BinaryWriter的区别兼谈编码。

    原文:http://www.cnblogs.com/ybwang/archive/2010/06/12/1757409.html 参考: 1. <C#高级编程>第六版 2.  文件流和数据 ...

  7. WPF(六) Command 命令模型源码分析

    1.ICommand源码分析 ​ 在之前 WPF(三) WPF命令 中我们已经分析过了 WPF 的命令系统,包括WPF默认的 RoutedCommand 以及我们自定义的 ICommand 命令实现. ...

  8. 周家安:我的十年编程自学之路

    有一群人对计算机兴致盎然,却总不得要领,所以本期社区之星的话题是:编程学习.在编程路上该如何选择和学习语言?编程学习的重点是什么?如何克服编程学习中的枯燥和无聊?社区之星第十四期采访了自学编程的周家安 ...

  9. 转给迷茫的自己---专访周家安:我的十年编程自学之路

    摘要:有一群人对计算机兴致盎然,却总不得要领,所以本期社区之星的话题是:编程学习.在编程路上该如何选择和学习语言?编程学习的重点是什么?如何克服编程学习中的枯燥和无聊?社区之星第十四期采访了自学编程的 ...

最新文章

  1. EditText 中文文档
  2. Docker:You cannot remove a running container
  3. matlab lti全响应,《LTI系统的响应——实验报告》.doc
  4. python random从集合中随机选择元素
  5. Python学习笔记:演示多根继承
  6. ListView的adapter中getView方法一直调用
  7. 技术文档模板_腾讯文档-轻松操作指南
  8. 【吐血整理】Java项目源码分享
  9. 使用谷歌地图拾取异国坐标
  10. 大数据技术——Azkaban(阿兹卡班)
  11. 本地使用Idea创建SpringBoot项目并给gitee托管
  12. labview学习笔记1-数字输入与输出
  13. 工欲善其事必先利其器-C语言拓展–嵌入式C语言(一)
  14. php_curl.dll下载,php_curl.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  15. 安装 SIMATIC STEP7 Professional 一直停留在修改系统 估计剩余时间:2分钟
  16. WebSphere MQ概述
  17. C++多线程编程的几种实现方式小结
  18. 用WPF窗体打造个性化界面的图片浏览器
  19. CMMI-需求管理(REQM)
  20. HTML下拉菜单为什么是灰的,CSS实现的灰色下拉菜单效果代码

热门文章

  1. 数字货币引发的金融变革
  2. 【引用】DataGrid技巧大集合
  3. 小程序解决图片 或者视频下放存在缝隙,以及图片自适应高度。
  4. 小红书私信卡片android虚拟机实现代码
  5. 距离“啤酒专卖店”诞生还有多久?
  6. 软考总结--PERT图
  7. Java实现 蓝桥杯VIP 算法提高 5-3日历
  8. 从零搭建图书网站--v1.0
  9. java程序员一天多少行有效代码,持续更新~
  10. 2022年1月22日蓝桥杯STEMA竞赛C++中高级组第3题近似值