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. java常用包

    java的核心类都放在java这个包以及其子包下,java扩展的许多类都放在javax包以及其子包下.这些实用类也就是平时经常说的API(应用程序接口). 以下几个是java语言中常用包 java.l ...

  2. 【转】非常完善的Log4net详细说明

    转自:http://www.cnblogs.com/zhangchenliang/p/4546352.htmlhttp://www.cnblogs.com/zhangchenliang/p/45463 ...

  3. 让jquery easyui datagrid列支持绑定嵌套对象

    嵌套对象是指返回的json数据,是对象的某个属性自带有属性.而我们恰恰又需要这个属性,默认情况下easyui的datagrid是不支持绑定嵌套对象的.比如:datagrid的field属性只能为fie ...

  4. iText

    iText是著名的开放项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. 官方网站:http://itext ...

  5. Cortex依赖管理

    cortex中文博客链接: http://cnblog.ctx.io/post/91333512673/cortex 关于cortex项目, 参见项目主页: http://ctx.io 项目在gith ...

  6. Linux下用rpm方式安装MySQL

    1.MySQL下载地址. www.mysql.com/downloads/mysql-4.0.html 下载MySQL 5.1版本的2个包(根据你的实际需求下载所需要的包): MySQL-server ...

  7. 基于脚本的动画的计时控制(“requestAnimationFrame”)(转)

    requestAnimationFrame 方法的支持,该方法通过在系统准备好绘制动画帧时调用该帧,从而为创建动画网页提供了一种更平滑更高效的方法.在此 API 之前,使用 setTimeout 和  ...

  8. 增加Android模拟器的内存

    1,在window中,打开'C:\Users\Administrator\.android\avd\4.4.2.avd\config.ini'文件(我的是win7,xp的貌似不是'Users',是'D ...

  9. 武汉科技大学ACM :1007: 华科版C语言程序设计教程(第二版)习题7.10

    Problem Description 输入n(n<100)个字符串,每个字符串长度不超过1000,将他们按字典顺序输出. Input 多组测试样例. 每组第一行有一个整数n表示有n个字符串. ...

  10. 拿起cl.exe,放下IDE

    笔者在这里介绍一种使用cl.exe编译源文件的方法,可以手动执行编译过程而不再依赖IDE,此外,笔者还介绍一些使用cl.exe编译简单源代码的方式. cl.exe是windows平台下的编译连接程序, ...