Delegate与Action,建议先看为敬
背景
很多C#初学者,都遇到过这样的问题,今天就这个问题,进行分析。
根源
先说下这个问题产生的根源,大家都知道,程序运行起来之后,首先会有一个主线程,主线程用于处理控件生成、界面渲染、事件响应等操作,因此我们可以理解为窗体里的控件是属于主线程的。
如果我们想实现与主线程同时执行另一件事,一般会去使用多线程,因此多线程,从某种意义上来说,它和主线程的身份是平等的,就像你和你的同事的关系一样,你们是平级的关系。如果你同事有一天想从你手上把你的项目程序拿过去,你愿不愿意?
所以,如果在多线程里操作主线程的控件,你觉得主线程会不会答应,当然不会,所以,它就会给你报个错,给你一个警告!
分析
那么如何解决呢?
所以你的同事就会找到你们领导,跟你们领导这样说:我手头上的这个100万的项目,能给公司带来50%的利润,现在需要用到他之前那个项目里的一个小知识,需要他把程序给我参考一下。
于是,领导和你“商量”了一下,你便妥协了。
你那个同事利用的招数叫做—————委托。
现在多线程要干这个事,也要靠委托来做。
委托
委托定义:委托(Delegate) 是对某个方法的引用的一种引用类型变量。
那就别看了,跟着我动手做。
1、声明委托
委托声明需要根据执行的方法来定,严格来说,就是根据执行方法的返回值和参数,我们只是给窗体的Text设置一个固定值而已,因此我们的参数是空,返回值也为空。
声明委托如下:
//声明委托public delegate void SetFormTextDelegate();
2、创建委托对象
委托严格来说是一种类型,就像类一样,如果想要调用某个类,必须要创建一个该类的对象,所以我们要创建一个委托对象:
//创建委托对象private SetFormTextDelegate SetFormText;
3、创建委托方法
委托对象也只是一个对象而已,就像领导一样,领导是不可能干活的,最终干活还得靠底下的兵来干,所以我们还得招人去干活。
招人干活就是委托方法,我们现在这个活很简单,所以我们的方法也很简单。
//执行方法private void ExcuteMethod(){this.Text = "多线程测试";}
4、委托绑定
我们招到了一个“兵”,现在也有一个部门领导,怎么把他们联系起来呢?
很简单,让人事把这个兵分到这个部门就行了,这个分配的过程就是委托绑定,代码如下:
//委托绑定this.SetFormText = ExcuteMethod;
5、委托调用
万事俱备,只欠东风,终于干活了。
作为公司的老板,一般是不可能跟员工打交道的,他会把任务分配给部门领导,部门领导会把活再分配下去,所以我们委托调用,也是调用委托对象。
/// <summary>/// 多线程方法/// </summary>private void ThreadMethod(){//调用委托SetFormText();}
以上五步,就是委托的实现过程。
然而,我们运行之后,还是会报错。
没有那么简单的事!
因为想要在多线程里操作主线程的控件,你还得经过控件的同意,怎么经过控件同意呢?
控件的父类Control提供了一个这样的方法:
意思就是说,想要操作控件,必须要通过Invoke方法来实现,Invoke方法里参数是一个委托,于是,我们只能灰溜溜地,这样写:
果然,按照规矩来,就能达到效果:
简化
微软从某个版本开始,出来了Action和Lamda表达式,Action是系统委托,也就是说,不需要我们手动创建委托了,它有个兄弟叫Func,Action没有返回值,最多可以有16个参数,Func必须要有返回值,最多可以有16个参数,最后一个参数表示返回值。
于是我们开始简化:
第一步简化:用Action作为委托来创建
/// <summary>/// 多线程方法/// </summary>private void ThreadMethod(){//创建委托、绑定委托Action action = new Action(ExcuteMethod);//调用委托this.Invoke(action);}//执行方法private void ExcuteMethod(){this.Text = "多线程测试";}
第二步简化:委托对象只用一次,所以可以直接放到参数里
/// <summary>/// 多线程方法/// </summary>private void ThreadMethod(){//创建委托、绑定委托、调用委托this.Invoke(new Action(ExcuteMethod));}//执行方法private void ExcuteMethod(){this.Text = "多线程测试";}
第三步简化:用Lamda表达式代替方法
/// <summary>/// 多线程方法/// </summary>private void ThreadMethod(){//创建委托、绑定委托、调用委托this.Invoke(new Action(()=>{this.Text = "多线程测试";}));}
总结
我们所以常写的那行代码,其实只是一种简写方式而已,委托的五步法,不管怎么简化,怎么优化,其实本质还是一样,都离开不了这五个步骤。
这就是经典。
都看到这里了,是不是要点个赞呢?
Delegate与Action,建议先看为敬相关推荐
- C#基础知识学习之 ✨ 委托的兄弟姐妹们 delegate、Action、Func、Predicate
委托 delegate.Action.Func.Predicate 简单介绍 delegate.Action.Func.Predicate 几种基础的委托结构 几种委托的实例用法 开始分析 deleg ...
- C#里关于委托的使用方法使用delegate、Action、func和Thread声明、锁安全
1.委托的类型: Invoke or BeginInvoke Invoke或者BeginInvoke方法都需要一个委托对象作为参数.委托类似于回调函数的地址,因此调用者通过这两个方法就可以把需要调用的 ...
- C# Delegate、delegate、 Action、 Func
首先Delegate 和delegate,Delegate是类, delegate是关键字,按照官网的解释,使用delegate定义的委托类型,最终会被编译器编译为Delegate类型 Action和 ...
- C#委托(delegate、Action、Func、predicate)和事件
C#委托(delegate.Action.Func.predicate)和事件 - 园子的蜗牛 - 博客园 C#之委托 - 摸鱼王 - 博客园 C++函数指针与C#委托之间有何联系 - 51CTO.C ...
- 提高程序并发量的几个建议(不看保证后悔死你)
提高程序并发量的几个建议(不看保证后悔死你) 2017年08月04日 16:09:20 幸福de小公猪 阅读数:11040 标签: 并发调优提高并发量读取速度Java优化 版权声明:本文为博主原创文章 ...
- 一个牛人给Java初学者的建议(必看篇)
给初学者之一:浅谈Java及应用学java 从不知java为何物到现在一个小小的j2ee项目经理虽说不上此道高手,大概也算有点斤两了吧每次上网,泡bbs逛论坛,没少去java相关的版 面总体感觉初学者 ...
- 了解Latch建议去看vage写的一系列本版精华贴
想要进一步了解latch建议去看vage写的一系列本版精华贴. http://www.itpub.net/thread-1605241-1-1.html http://www.itpub.net/th ...
- C++程序员学习发展方向分析和指导(C++入门学习指导建议必看)
一路走来,磕磕碰碰,走到现在,历经了千辛万苦,可是路才刚刚开始走,未来还很长,我将会不断的思考和探索. 我想,如果是打算走进C++编程的同志们,请好好看完这篇文章,或许,对你的发展有所启发.但是,不要 ...
- 职业选择与规划(转)——强烈建议耐心看完
在担任公司高管的几年间,我面试过数以百计的各个层面的员工,其中最让我感到遗憾的一个现象就是很多人有着非常好的素质,甚至有的还是名校的毕业生,因为不懂得去规划自己的职业,在工作多年后,依然拿着微薄的薪水 ...
最新文章
- PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent
- 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
- python 字符串总结
- java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)
- java实现无序数组结构
- python(11)-if语句,断言assert
- 简单网络管理协议SNMP
- Mac Postman app使用方法
- python爬虫爬取一次数据多长时间_「Python爬虫系列讲解」1. 网络数据爬取概述
- ssm三个框架分别用来干什么_SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)
- 卸载mysql服务命令_完全卸载MySQL服务的方法
- angular4之管道
- ZigBee Routing Tables 路由表
- 2020年下半年湖北软考报名通知
- 复旦大学计算机学院金玲飞,金玲飞 - 复旦大学 - 计算机科学技术学院
- CentOS 6.2下安装基于Suricata + Barnyard 2 + Base的入侵检测系统
- 在线重定义在线更换分区表分区类型
- 七夕送女朋友什么礼物好?不会送礼的男生速看!
- 2018-9-3-vue的tabs表单代码的思考
- es中should查询使用注意
热门文章
- php投屏代码,乐享影视app源码 e4a影视app开源源码 支持下载存缓投屏等功能源码下载...
- MapReduce的关系代数运算
- Flutter下载图片和视频
- 智慧展馆 |基于臻图ZTMAP3DGIS数字孪生技术落地创新智慧展馆
- 【定制项目】【触摸屏一体机】【自启动运行】【M15 消防安全宣传】【横屏版】主要模块:视频 + 音频 + 图标 + 问答游戏
- 腾讯云直播插件 TcPlayer.js 接入vue
- Verilog笔记——数据检测/独热码检测——Quartus与Modelsim仿真
- 51nod 1414 冰雕 暴力
- GDOI 2021游记
- python两个文件内容异或_python 异或两个文件 | 学步园