委托、多播委托(MulticastDelegate)

多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托;即,其调用列表中可以拥有多个元素的委托。实际上,我们自定义的委托的基类就是 MulticastDelegate。

在 C 或 C++ 中与委托最为相似的是函数指针。委托可以表示静态方法或实例方法。当委托表示实例方法时,委托不仅存储对方法入口点的引用,还存储对类实例的引用。与函数指针不同,委托是面向对象和类型安全的。

多播委托具有一个带有链接的委托列表,称为调用列表,在对委托实例进行调用的时候,将按列表中的委托顺序进行同步调用。

在实际应用中,如果我们要改变通常的事件广播的方式时,就需要应用这一特性了。比如通常我们都是这样触发一个事件广播:

方法 MyEventMethod1 和 MyEventMethod2 将先后被调用。

可是,在上面定义的委托 MyEventHandle 是有返回值的,上面的方式调用(string result = MyEvent("John");)之后返回的是哪一个方法的返回值呢?当然是最后一个 MyEventMethod2 。

但如果我们需要获得所有方法的返回值该怎么办?

还有,假如在调用 MyEventMethod1 时方法内部抛出异常,这将导致后面的方法无法得到执行。那我们如果要求不管被调用的方法无论是否抛出错误,都要保证列表中的所有方法必须得到调用,那该怎么办?

针对这两种场景,我们就得自己实现对多播委托的调用列表中的每个委托进行逐个调用了。

Delegate 的API中提供了一个方法供我们获得调用列表:

    

通过逐个调用委托即可:


 Delegate[] delegList = MyEvent.GetInvocationList();
List<string> resultList = new List<string>();
foreach (MyEventHandle del in delgtList)
{
try
{
resultList.Add(del("John"));
}
catch (Exception ex)
{
//异常处理;
}
}
 public override sealed Delegate[] GetInvocationList()

事件触发代码

 public delegate string MyEventHandle(string name);

        public static event MyEventHandle MyEvent;

        static void Main(string[] args)
{
MyEvent += new MyEventHandle(MyEventMethod1);
MyEvent += new MyEventHandle(MyEventMethod2);
MyEvent("John");
}

委托、多播委托(MulticastDelegate)的更多相关文章

  1. .net 多播委托的使用方法以及场景,更简单的观察者模式

    首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...

  2. IOS 多播委托(GCDMulticastDelegate)

    原文:http://www.cnblogs.com/dagehaoshuang/p/4043264.html 在IOS中为了实现回调一般有如下几个方法: delegate 通知中心 block KVO ...

  3. 【C#进阶】多播委托和委托数组像是一回事~

    这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { publi ...

  4. 委托Delegate,多播委托和委托链

    定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static Calculat ...

  5. C# 注销掉事件,解决多播委托链表的问题

    c#的事件是多播委托.当绑定多个事件时,事件会依次触发,清除掉注册的委托链表:方法1  C# Code  12345678910111213141516171819202122232425262728 ...

  6. 【小白学C#】谈谈C#多播委托因异常而终止的解决方案

    一.前言 前几天,马三在与朋友闲聊技术的时候,朋友忽然抛出一个问题,把马三难倒了,本着求知的精神,回来以后马三就查阅了相关资料并做了一些实验,终于把问题搞明白了,因此写下本篇博客记录一下.首先,问题是 ...

  7. C# 委托链(多播委托)

    委托既可以封装一个方法,又可以对同一类型的方法进行封装,它就是多播委托 using System; using System.Collections.Generic; using System.Lin ...

  8. 多播委托和匿名方法再加上Lambda表达式

    多播委托就是好几个方法全都委托给一个委托变量 代码: namespace 委托 { class Program { static void math1() { Console.WriteLine(&q ...

  9. ios多播委托

    在现实中回调的需求也分两种 一对一的回调. 一对多的回调. 对于一对一的回调,在IOS中使用delegate.block都能实现.而一对多的回调基本就是通知中心了. 假如现在有一个需求,我们以图片下载 ...

随机推荐

  1. PHP检测数组中的每个值是否含有特殊字符

    本文出至:新太潮流网络博客 /** * [TestArray 检测数组是一维还是二维] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB ...

  2. python常用模块之string

    python常用模块string模块,该模块可以帮我们获取字母.数字.特殊符号. import string #打印所有的小写字母 print(string.ascii_lowercase) #打印所 ...

  3. python的函数(一)

    摘要: python的函数(一)主要写函数的基础部分. 1,函数的好处 2,函数的定义与调用 1,函数的好处 函数应该有2个好处: 1,是降低代码的复杂度, 2,是减少代码量,避免重复的写相同的代码. ...

  4. poj_3253 Fence Repair

    Fence Repair Description Farmer John wants to repair a small length of the fence around the pasture. ...

  5. NodeJS链接MySql数据库

    //1.用npm命令安装mysql模块 npm install mysql //2.js文件中引入mysql模块 const mysqlModule = require('mysql'); //3.创 ...

  6. mysql 5.5 数据库 utf8改utf8mb4

      由于需要用到utf8mb4,之前是utf8现在给改成utf8mb4 查看当前环境 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_ ...

  7. 【转载】Please configure Android Sdk(android studio)解决办法

    https://blog.csdn.net/u011622280/article/details/79005453 studio就报Please configure Android Sdk,重启and ...

  8. 51nod 贪心算法题集

    2070 最小罚款: 题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w.问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间. 分析:任务按时间排个 ...

  9. 【9】python关于os模块与os.path的相关操作

    ---恢复内容开始--- #__author:"吉*佳" #date: 2018/10/20 0020 #function: # os模块知识点 import os # 获取平台名 ...

  10. 1.Dubbo2.5.3源码编译

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.安装JAVA.Git.Maven 安装过程省略,请自行百度.       2.编译dubbo (1)从ht ...