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

 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
private void ClearAllEvents (object objectHasEvents, string eventName)
{
    if (objectHasEvents == null)
    {
        return;
    }

try
    {
        EventInfo[] events = objectHasEvents.GetType().GetEvents (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        if (events == null || events.Length < 1)
        {
            return;
        }

for (int i = 0; i < events.Length; i++)
        {
            EventInfo ei = events[i];

if (ei.Name == eventName)
            {
                FieldInfo fi = ei.DeclaringType.GetField ("printPageHandler", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                if (fi != null)
                {
                    fi.SetValue (objectHasEvents, null);
                }

break;
            }
        }
    }
    catch
    {
    }
}

 
 
 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
 
        //事件
 
        #region 开始查询用户业务编码事件
 /// <summary>
        /// 开始查询用户业务编码事件
        /// </summary>
        public static event EventHandler _BeginSearchUserCodeEvent;
        public static event EventHandler BeginSearchUserCodeEvent
        {
            add
            {
                ClearBeginSearchUserCodeEvent();
                _BeginSearchUserCodeEvent += value;
                last_BeginSearchUserCodeEvent.Add(value);
            }
            remove
            {
                _BeginSearchUserCodeEvent -= value;
            }
 
        }
        //上一次的BeginSearchUserCodeEvent委托
        private static List<EventHandler> last_BeginSearchUserCodeEvent = new List<EventHandler>();
        private static void ClearBeginSearchUserCodeEvent()
        {
            if (last_BeginSearchUserCodeEvent.Count <= 0)
            {
                return;
            }
            //注销掉  事件
            for (int i = 0; i < last_BeginSearchUserCodeEvent.Count; i++)
            {
                _BeginSearchUserCodeEvent -= last_BeginSearchUserCodeEvent[i];
            }
        }
        #endregion
 
 
 
        #region  结束查询用户业务编码事件
      
        /// <summary>
        /// 结束查询用户业务编码事件
        /// </summary>
        public static event EventHandler _EndSearchUserCodeEvent;
        public static event EventHandler EndSearchUserCodeEvent
        {
 
            add
            {
                ClearEndSearchUserCodeEvent();
                _EndSearchUserCodeEvent += value;
                last_EndSearchUserCodeEvent.Add(value);
            }
            remove
            {
                _EndSearchUserCodeEvent -= value;
            }
 
        }
        //上一次的EndSearchUserCodeEvent委托
        private static List<EventHandler> last_EndSearchUserCodeEvent = new List<EventHandler>();
        private static void ClearEndSearchUserCodeEvent()
        {
            if (last_EndSearchUserCodeEvent.Count <= 0)
            {
                return;
            }
            //注销掉  事件
            for (int i = 0; i < last_EndSearchUserCodeEvent.Count; i++)
            {
                _EndSearchUserCodeEvent -= last_EndSearchUserCodeEvent[i];
            }
        }
 
        #endregion

C# 注销掉事件,解决多播委托链表的问题的更多相关文章

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

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

  2. 委托+内置委托方法+多播委托+lambda表达式+事件

    委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...

  3. 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

    委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...

  4. 委托、泛型委托、多播委托、匿名函数、lamda表达式、事件

    1.为什么要使用委托 将一个方法作为参数传递给另一个方法 2.委托概念 public delegate int 委托名(int a, int b); 声明一个委托类型,可以用访问修饰符修饰,deleg ...

  5. C#多播委托和事件的区别与关系

    事件是对委托的封装. 如果一个类里,你把一个委托声明为 public 了,那么外部就可以随意改变委托变量的值,包括清空委托变量等,这样的话就违背了面向对象思想的封装特性:但如果声明为 private ...

  6. ios多播委托

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

  7. IOS 多播委托(GCDMulticastDelegate)

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

  8. jQuery里面的普通绑定事件和on委托事件

    以click事件为例: 普通绑定事件:$('.btn1').click(function(){}绑定 on绑定事件:$(document).on('click','.btn2',function(){ ...

  9. Oracle 11.2.0.4.0 Dataguard部署和日常维护(4)-Datauard Gap事件解决篇

    Oracle dataguard主库删除备库需要的归档时,会导致gap事情的产生,或者备库由于网络或物理故障原因,倒是备库远远落后于主库,都会产生gap事件,本例模拟gap事件的产生以及处理. 1. ...

随机推荐

  1. Android应用开发学习之图片切换器

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 如果我们要实现类似Windows的照片查看器切换上一张下一张照片的效果,可以使用图片切换器ImageSwitcher ...

  2. SWIFT国际资金清算系统

    SWIFT又称:“环球同业银行金融电讯协会”,是国际银行同业间的国际合作组织,成立于一九七三年,目前全球大多数国家大多数银行已使用SWIFT系统.SWIFT的使用,使银行的结算提供了安全.可靠.快捷. ...

  3. Apache服务器 配置多个网站解决方案

    2016.5.28   今周六   下午   阴     无风 周末接了个小单,弄一个企业站,用php语言:于是又要拿起好久没动的php啦! 关键第一步是搭建Apache环境,在这里本人用的是wamp ...

  4. angularjs改变路由时控制器每次都执行两次

    原因如下: 代码里面也初始化了控制器 模板配置了一个控制器

  5. struts2的配置和使用

    一:配置stuts2的运行环境,把以下的包放到WEB-INF/lib目录下 1,structs2-core-2.1.6.jar       struts的核心库 2,xwork-2.1.2.jar   ...

  6. 生成 JSON 数据

    //build an info object and convert to json NSDictionary* info = [NSDictionary dictionaryWithObjectsA ...

  7. base64编码问题 需要对每个参数URL编码

    - (NSString *)encodeToPercentEscapeString: (NSString *) input { // Encode all the reserved character ...

  8. 经典C面试题

    12个有趣的C语言面试题 面试题C 摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出以下代码里的问题: #include< ...

  9. 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】

    集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...

  10. Gamit解算脚本

    这是一个解算单天的shell脚本,对于初学者很有帮助. 首先就是需要在项目(四个字符)建立rinex brdc igs 还有以年纪日命名的目录,然后提前准备好station.info和lfile.文件 ...