浅谈C#中的委托、事件与异步
从刚接触c#编程到现在,差不多快有一年的时间了。在学习过程中,有很多地方始终似是而非,直到最近才弄明白。
本文将先介绍用法,后评断功能。
一、委托
基本用法:
1.声明一个委托类型。委托就像是‘类'一样,声明了一种委托之后就可以创建多个具有此种特征的委托。(特征,指的是返回值、参数类型)
public delegate void SomeKindOfDelegate(string result);
2.创建一个在1中创建的委托类型的委托。
public SomeKindOfDelegate aDelegate;
3.为2中创建的具体的委托添加响应函数。响应函数必须符合1中的‘特征'。
aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate); private void aFunctionThatJustForDelegate(string result) { MessageBox.Show(result); }
4.完成以上三步之后,就可以使用Invoke来对委托进行调用了。Invoke可以选择调用的目标函数,调用优先级,以及调用的参数。
aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null);
上面是基本用法,除了这种基本用法之外,还可以结合var、匿名委托、lambda委托等方法。
完整代码:
namespace wtfIsDelegate { public delegate void SomeKindOfDelegate(string result); public partial class Form1 : Form { public event SomeKindOfDelegate aDelegate; public Form1() { InitializeComponent(); aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate); aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null); } private void btnDelegate_Click(object sender, EventArgs e) { } private void aFunctionThatJustForDelegate(string result) { MessageBox.Show(result); } } }
委托的用处:
委托的优点,是可以实现异步(BeginInvoke),还可以在某种需要同时调用多个同参数、返回值的情况下简化代码。
二、事件
基本用法:
1.定义委托。
public delegate void SomeKindOfDelegate(string result);
2.定义事件。
public event SomeKindOfDelegate aDelegate;
3.为事件添加响应函数。
process.Exited += new EventHandler(CmdProcess_Exited);
4.为事件规定触发(调用)方式。(【也可以没有触发方式,直接invoke】)
解说:
C#里,每一种‘事件Event'大概都对应着其‘事件处理者EventHandler'。比如Process类的OutputDataReceived事件对应着DataReceivedEventHandler,对于非特异性的‘事件',比如PasswordChanged 这种,它们统一都对应着RoutedEventHandler或者EventHandler这种较为通用的‘事件处理者'。然而,‘EventHandler'也只是充当了一个中介的角色,真正触发了‘Event'之后要做什么,还需要我们手动指定,像这样:
process.Exited += new EventHandler(CmdProcess_Exited); // 注册进程结束事件 。
EventHandler本来也是委托。比如
public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
自定义事件
自定义事件是一种类似于委托的方式,
自定义事件某种意义上改变了程序的流程,使得某个条件的变化由‘不断查询'转变为‘订阅与处理'的关系。
自定义事件需要有以下几个元素:
事件的发起者,事件的订阅,以及事件的处理程序。从发起者到处理程序之间是可以传参数的。
一个事件的‘发起'可以依赖于某种系统消息,比如‘OnKeyDown'、‘OnMouseClick'(【我目前还没见过这么写的源码】),也可以在某个条件达成时(比如两次输入了同样的字符)自行调用(其实收到系统消息也算是‘条件达成')。【更多的event是这么写出来的】
有些事件,并没有明显的‘发起者'。
委托和事件是啥关系
委托和自定义事件的使用方式十分十分类似。event 只有类的内部可以 Invoke,delegate的话,在哪都可以Invoke。调用的方式貌似也略有区别(传参方式)
由于调用方式和传参的差异,event显得更保守/稳定一些。event也更容易从‘理解'上更容易接受。
delegate貌似更多的用于进行异步(begin invoke)。而event则更多的用来做自定义事件。
委托和异步是啥关系
异步是委托可以实现的一种功能(或者叫做‘现象'也可以) 异步可以由很多种其他方式体现,比如多线程(thread,threadpool,task等等)。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!
栏 目:C#教程
下一篇:C#中抽象类与接口的区别详解
本文标题:浅谈C#中的委托、事件与异步
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/5811.html
您可能感兴趣的文章
- 01-10C#中查找Dictionary中的重复值的方法
- 01-10C#将图片存放到SQL SERVER数据库中的方法
- 01-10关于nancy中的身份验证
- 01-10C#中的事务用法实例分析
- 01-10C#实现读取DataSet数据并显示在ListView控件中的方法
- 01-10C#中的正则表达式介绍
- 01-10C#开发中的垃圾回收机制简析
- 01-10C#语言中的修饰符汇总
- 01-10C#中的 == 和equals()区别浅析
- 01-10C#基于委托实现多线程之间操作的方法
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法