范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C优雅编程之事件系统(三)进阶级

  上一节我们解决了界面死锁的问题,参考:C#优雅编程之事件系统:(二)入门级
  但是如果有100个类似的功能,该如何设计这个类呢?
  首先我们需要做的就是新建一个FileSearch类,把什么代码都放在界面类中处理终归是成不了系统。
  稍作整理后,我们得到的结果应该是下面的图示:
  logs是显示信息到输入框;tip是显示信息到label控件,这两个函数都是要跟界面交互的,难不成我需要在类中声明一个Form对象?但是每个界面对这些事件的处理都不同,如果是读取内容呢?如果是写入内容呢?.... 可以说,处理方式有很多种,我们是无法穷举的,所以这里我们需要的应该是一个函数变量,我们可以在调用查询前提前设置好这些函数变量,当这些事件到来的时候,动态调用这些函数就好了,我们把这种通常叫回调函数。
  这里我们需要引进一个关键字,Action,这个专门就是用来声明回调函数的,我们按F12可以看到它的声明,其实就是delegate,代理。
  比如分别声明带参数和不带函数的变量:Action fun_no_param; Action fun_has_param;
  调用时:fun_no_param(); fun_has_param("hello");
  这个就可以完美解决上一节我们提出的问题了,我只要在调用的时候指定这些函数的调用去向,等查询到内容时,就自动调用到我指定的函数中了。无论以后有多少调用的地方,只要调用之前指定好了就可以。
  于是我们继续做改进计划:
  FileSearch类代码:    public class FileSearch     {         public Action? file_found;         public Action? folder_found;         public Action? search_begin;         public Action? search_end;         public Action? search_exception;          public string file_ext = "";          public async void CallSearch(string root_folder)         {             DirectoryInfo di = new DirectoryInfo(root_folder);             if (search_begin != null) search_begin(this);             await SearchAllFiles(di);             if (search_end != null) search_end(this);         }          async Task SearchAllFiles(DirectoryInfo di)         {             try             {                 if (folder_found != null) folder_found(di);                 FileInfo[] files = di.GetFiles(file_ext);                 foreach (FileInfo fi in files)                 {                     if (file_found != null) file_found(fi);                 }                 await Task.Delay(1);                 DirectoryInfo[] direct = di.GetDirectories();                 foreach (DirectoryInfo diTemp in direct)                 {                     await SearchAllFiles(diTemp);                 }             }             catch (Exception ex)             {                 if (search_exception != null) search_exception(ex);             }         }      }
  对5个事件分别声明5个Action。
  Form调用:        public void logs(string msg)         {             tbxLog.AppendText(msg + "r ");         }          public void tip(string msg)         {             lblTip.Text = msg;         }          void file_found(object o)         {             FileInfo fi = (FileInfo)o;             if (fi.FullName.Contains(find_str))             {                 logs(fi.FullName);             }             tip(fi.FullName);             file_count++;         }          void folder_found(object o)         {             DirectoryInfo di = (DirectoryInfo)o;             tip(di.FullName);             file_count++;         }          void search_begin(object o)         {             logs("开始");             find_str = "预算";             file_count = 0;         }          void search_end(object o)         {             logs(string.Format("结束。检索文件数量:{0}", file_count));         }          void search_exception(object o)         {             Exception ex = (Exception)o;             logs(ex.Message);         }          public int file_count = 0;         public string find_str = "";          private void btnLevel1_Click(object sender, EventArgs e)         {             FileSearch fs = new FileSearch();             string root_folder = "C:test";             fs.file_ext = "*.xls";             fs.file_found = file_found;             fs.folder_found = folder_found;             fs.search_begin = search_begin;             fs.search_end = search_end;             fs.search_exception = search_exception;             fs.CallSearch(root_folder);         }
  调用前分别设置5个事件的回调函数,触发事件后,就分别回调我们指定的函数。这种方式无论以后需要扩充多少处理方式,只要换回调函数就好了,FileSearch内部的代码就不需要再动了。如果以后需要在FileSearch中加功能或改Bug,也只需要改动FileSearch这一个文件就全部生效了。
  这种方式相比入门级,灵活性上有了很大的提升,按我的评判标准,可以称之为系统了,但是离优雅还不够。这次我们解决的是文件批量搜索,那下次我们做一个爬虫系统,也需要有类似的事件处理机制,我就还得需要再定义类似这些事件;然后我要设计一套消息系统,有100种消息,难道我要声明100个Action变量吗?显然有些笨拙了。
  为了优雅,我们还需要继续进化。欲知后事如何,且请君关注我,不迷路,下节继续:)
  -------------
  说个题外话,第二节遇到一个网友对我的代码提成质疑,一说不是异步,二说都堆在UI线程不够优雅。我明明讲的是事件系统,他的关注点却盯在UI线程,思维不在一个层面的沟通起来真是累。我想跟大家说的是:关于异步以及多线程,后面会开文章来讲。另外,有了优雅设计的基础,想改成什么不都是几行代码的事吗,又何必纠结呢?
Github标星3。8K,基于SpringBoot框架和SaaS模式ERP软件源码分享在今天逛GitHub的时候,无意中发现一个基于SpringBoot框架和SaaS模式好用的ERP软件,觉得蛮不错的,特意分享给头条上的粉丝朋友们,接下来我会给大家介绍这个项目的一些京东毫秒级热key探测框架设计与实践,已实战于618大促在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题。或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户,这些突发的无法预企业级微服务框架,前后端分离基于SpringCloud源码分享基于SpringCloud的企业级微服务框架(用户权限管理,配置中心管理,应用管理,。),其核心的设计目标是分离前后端,快速开发部署,学习简单,功能强大,提供快速接入核心接口能力,基于SpringCloud微服务化开发脚手架平台源码免费分享SpringCloud微服务化开发平台,具有登录,菜单以及按钮权限校验,快速生成脚手架,统一的异常和日志处理,使用elasticsearch6。3的数据存储及简单的搜索功能。目前升你知道Redis可以实现延迟队列吗?推荐阅读基于springboottiooauth2。0前端vuede超轻量级聊天软件分享基于SpringCloud微服务化开发脚手架平台源码免费分享基于springboot2。0跟从100G网卡看未来数据中心发展趋势网卡,即网络接口控制器,也被称为网络适配器或局域网接收器,一般是安装在计算机或服务器上,通过网络与另一台计算机服务器或其他网络设备进行通信,目前网卡种类繁多,分类也较为多样,可按照10G国产rdma网卡大数据应用特点目前,5G网络人工智能工业互联网物联网为代表的新基建大力推动实施,企业用户个人用户以及整个社会体系应用所产生的数据再次呈井喷式爆发,然而,传统网络的存储方法已难以满足日益繁多且高速一个基于JavaFX和Vertx的跨平台MySQL数据库管理工具源码分享这是一个基于JavaFX和Vertx的免费跨平台的数据库管理工具。关注转发本篇文章之后私信回复源码我给你发免费下载方式支持创建修改连接。基本表crud操作。支持创建修改表。支持重命OCP网卡助力整机柜交付或成未来数据中心发展主流随着5GAI应用普及带来数据量快速增长,数据中心规模的不断扩张,如何提高交付效率优化整体TCO,降低运维复杂度成为数据中心面临的主要挑战,而整机柜则以密度高交付快易维护投资回报高的基于Kong和Kubernetes的WebApi多版本解决方案一背景1。讲故事去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的。netsdk。网址httpshelp。aliyun。comdocument国产四光口千兆以太网卡,性能领先同类产品随着互联网社会的高速发展,人们对于网络速度的需求越来越高,在计算机应用中,PCIe总线接口在一定程度上影响着网络的传输速度。在网络总线接口上,PCIe是继ISA和PCI总线之后的第
潮湿发霉?氧气地下室的美好你无法想象地下影院!地下酒窖!地下健身房!为什么敢想不敢做?别墅住户花大价钱精装别墅,交房使用后没多久就出现了地下室墙面和地面出现渗水,墙体剥落,家具电气藏品腐烂发霉等状况,让客户苦恼不堪。别抱有幻想了!苹果怎会良心,用户需求根本无法引导苹果我不知道为什么当我听说iPhone12将以128G开售时,我只感觉情况不妙啊,那么256G可能会被阉割掉了,或者像三星一样令人恶心,只提供128G版本。今年的iPhone产品线是有决策参考9的美国用户已删除Facebook账号Facebook积极造芯片1真动手了9的美国用户已删除Facebook账号事件近日,Facebook的大规模泄密事件引发了民众对个人隐私和数据的恐慌,也使该公司成为了美国人最不信任的科技巨头。技术研究机构T良性进化的内容生态助力抖音日活破1。5亿近日,抖音公布了最新的用户数据,国内的日活用户突破1。5亿,月活用户超过3亿。特别是今年春节期间,抖音的日活用户数实现了井喷,由不到4000万上升到了近7000万,短短的一个春节假广和通蜂窝通信次龙头,精准市场策略取得更优利润选股理由营收净利润双双大增股价逼近历史新高成交量持续放大证券简称广和通评级A数据截止日期2019年9月30日单位亿元证券代码300638成立日期1999年所在地深圳一主营业务主营业怡合达国内工业品一站式采购平台,成长之路道宽且长独立客观第三方研究,为您筛选优质上市公司证券代码301029综合评级AA一主营业务评分801业务分析公司主要产品分为自动化控制工厂客户(下文称FA工厂)在生产自动化生产线和设备中提中新赛克A股网络可视化龙头,新高只是小目标选股理由业绩稳定增长成交量放大逼近历史新高证券简称中新赛克评级A数据截止日期2019年9月30日单位亿元证券代码002912成立日期2003年所在地深圳一主营业务主营业务网络可视化移远通信蜂窝通信龙头高速增长,头悬达摩克利斯之剑选股理由营收大幅增长蜂窝通信龙头新股证券简称移远通信评级AA数据截止日期2019年9月30日单位亿元证券代码603236成立日期2010年所在地上海一主营业务主营业务物联网领域蜂窝环旭电子A股电子制造服务龙头,受益国产化大趋势选股理由业绩稳定增长大陆电子制造服务龙头成交量持续放大突破平台证券简称环旭电子评级A数据截止日期2019年9月30日单位亿元证券代码601231成立日期2003年所在地上海一主营业拉夏贝尔折翼的天使坠入深渊,断臂求生亦难返天空选股理由股价大幅下滑底部放量上涨证券简称拉夏贝尔评级CC数据截止日期2019年9月30日单位亿元证券代码603157成立日期2001年所在地上海一主营业务主营业务上装下装裙装及配饰容知日新国内工业设备运行监控前五风电周期向下其他应用崛起独立客观第三方研究,为您筛选优质上市公司证券代码688768综合评级A一主营业务评分751业务分析公司是一家工业设备智能运维整体解决方案提供商,简单说来就是为工业设备提供状态监测和