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. 在ios中解析json数据

    刚刚下午那会 弄了个 解析 xml  demo的小例子,本想着json也挺复杂 弄还是 不弄,但是简单的看了下 发现挺简单 考虑了很久,还是写上来吧,毕竟json用得太多了,而且算是自己的积累吧,毕竟 ...

  2. Unity3D基础学习之AssetBundle 资源包创建与加载

    前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了.下面介绍AssentBundle. AssetBundles让你通过WWW类流式加载额外 ...

  3. java cmd常用命令

    熟悉Java的常用命令 面试例题11:使用jar命令. 请使用jar命令,将test文件夹压缩成.jar文件,并简述其压缩包的结构. 考点:对于Java程序员来说,更多情况下是使用集成Java开发工具 ...

  4. Android开发之扫描附近wifi热点并列表显示

    近期项目中用到了wifi模块.今天做一个简单的总结. 參考:http://www.2cto.com/kf/201310/253617.html 1.如何获取wifi对象并进行操作 要操作WIFI设备, ...

  5. honeywell D6110开发的一个工厂仓库追溯识别

    近日.接触并开发了一个用honeywell D6110 二维扫描PDA的项目,应用也比較简单. 就是货品物料编码.通过中间码相应,然后中间码再依照不同OEM品牌须要生成各种商品条码并带有流水号. 要求 ...

  6. 静态代码检查工具 cppcheck 的使用

      CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们 ...

  7. codevs 1028 花店橱窗布置 (KM)

    /*裸地KM*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 110 #d ...

  8. location.href的用法

    *.location.href 用法: top.location.href=”url”          在顶层页面打开url(跳出框架) self.location.href=”url”       ...

  9. HTML5 microdata

    schema.org 测试地址 http://www.google.com/webmasters/tools/richsnippets

  10. 002_系统表查询(sysdatabases等)

    002_系统表查询(sysdatabases等) --1.获取所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name --2.获取所有表 ...