浅谈C#中的委托、事件与异步

作者:sxyy 时间:2022-04-25 23:05:34 

从刚接触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等等)。

来源:http://www.cnblogs.com/Soviet/p/6599430.html

标签:C#,委托,事件,异步
0
投稿

猜你喜欢

  • java开发中使用IDEA活动模板快速增加注释的方法

    2021-09-25 20:42:24
  • SpringMVC项目异常处理机制详解

    2023-03-12 13:13:25
  • Java 多线程并发ReentrantLock

    2022-02-23 11:53:23
  • 通过图例了解PowerDesigner使用方法

    2021-06-05 23:16:24
  • 详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    2022-03-22 13:03:02
  • java Disruptor构建高性能内存队列使用详解

    2022-02-03 00:41:14
  • Spring Boot2如何构建可部署的war包

    2023-11-29 06:40:59
  • 解决Mybatis-Plus操作分页后数据失效问题

    2023-11-25 11:31:55
  • Fluent Mybatis让你摆脱Xml文件的技巧

    2023-10-02 18:31:00
  • 处理java异步事件的阻塞和非阻塞方法分析

    2023-04-16 05:06:01
  • java中sleep方法和wait方法的五个区别

    2023-08-27 18:37:23
  • 项目为什么引入log4j而不是logback代码

    2023-02-02 07:51:07
  • java 非对称加密算法RSA实现详解

    2023-11-25 07:41:36
  • java算法题解牛客BM99顺时针旋转矩阵示例

    2021-07-08 18:55:18
  • Android Build类的详解及简单实例

    2023-07-02 21:12:45
  • java中使用map排序的实例讲解

    2021-06-24 09:34:10
  • 比Math类库abs()方法性能更高的取绝对值方法介绍

    2023-10-14 07:51:36
  • 一文带你探究Spring中Bean的线程安全性问题

    2023-10-03 10:52:13
  • java编程实现优先队列的二叉堆代码分享

    2022-11-13 15:32:13
  • 深入了解JAVA HASHMAP的死循环

    2023-11-28 00:32:12
  • asp之家 软件编程 m.aspxhome.com