c#事件求解

闲来无聊对于clr一书又重新温习了下,但是看到事件这张后还是有很多的困惑,对于事件能力CLR是这样描述,通知其它对象发生特定的事情。

1.其它对象:是指对于事件的关注者

2.特定的事件:对于满足事件交互的消息,这个消息都继承EventArgs

3.通知:是指对于事件关注者订阅的事件进行回调(不知道这么理解是否有问题,请喷)

接下来是按照我按照书中的思路实现了一个事件发布,并且实现关注者事件的调用

1、创建满足事件交互的消息

/// <summary>
/// 指定消息事件的附加消息内容
/// </summary>

public class EventMsg:EventArgs
{
public EventMsg(string
msgFromer,string msgSender,string msg)
{
this.Msg =
msg;
this.MsgFromer = msgFromer;
this.MsgSender =
msgSender;
}
public string Msg { get; set; }

public string MsgFromer { get; set; }
public string MsgSender { get;
set; }
}

2、创建事件的管理者类

/// <summary>
/// 事件管理类
/// 1.提供定义事件消息的暴露事件
///
2.执行消息事件的通知回调
/// 3.保证事件调用线程的原子性
/// </summary>
public class
EventManager
{
public string Ok { get; set ; }

//提供暴露的消息事件
public event EventHandler<EventMsg> Click;

//唤起事件的执行,对事件的关注方进行回调
public virtual void OnClick(EventMsg e)

{
//保证事件调用线程的原子性
EventHandler<EventMsg> temp =
Interlocked.CompareExchange(ref Click, null, null);
if (temp !=
null) temp(this, e);
}

//将事件调用者的输入数据转换为期望事件
public
void SimulateOnClick(string fromer,string sender,string msg)
{

EventMsg msge = new EventMsg(fromer, sender, msg);

OnClick(msge);
}

}

3、创建事件的关注类(不知道叫事件监听器是否有误)

public class BtnClickListener
{
public
BtnClickListener(EventManager myEvent)
{
myEvent.Click
+= BtnClick;
}

private void BtnClick(Object sender,EventMsg e)
{

Console.WriteLine("这是按钮的监听器");
Console.WriteLine(string.Format("from:{0},send:{1},msg:{2}",e.MsgFromer,e.MsgSender,e.Msg));

}

public void UnRegistEvent(EventManager myEvent)
{

myEvent.Click -= BtnClick;
}
}

4、事件的调用

static void Main(string[] args)
{

EventManager em = new EventManager();//创建事件管理者

BtnClickListener btnListener = new
BtnClickListener(em);//实现消息关注着

em.SimulateOnClick("btn", "btnListener",
"btnListenerdemo");//事件管理者通知关注者
//位置不同效果不同
btnListener.UnRegistEvent(em);

Console.Write("asdf");
Console.Read();

}

对于这个过程我是理解,但是还有有点不明白的是事件的关注者的为什么不直接来进行自己的方法调用,为什么而是通过事件管理者来回调呢?这个博友们能多列举掉这种事件的使用的场景和业务么?谢谢

c#事件求解,布布扣,bubuko.com

时间: 2024-10-10 10:45:42

c#事件求解的相关文章

没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达

小结: 1. 矩阵就是一张普通的数表 矩阵乘法它表达的是一件具体的有现实生活场景的事件:但是不能借助它表达所有的事件. 它能,可能是只能,表达的是这个事件是通过列元素和行元素的相乘,而不能在拆分为单独的两个2行-列元素: 事件的原子不是某个行/列元素,而是一行/列元素. 3个菜市场卖着不同价格的白菜.萝卜.土豆:求总采购支出:采购量矩阵*价格矩阵 3个菜市场卖着不同价格的白菜.萝卜.土豆,现在在总采购支出计入运费,而不同的菜市场不同蔬菜的单位重量运费为价格的不同倍:例如第一个菜市场的白菜.萝卜.

非线性整数优化问题的求解

Monte Carlo方法简介       今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代中期,为适应当时的曼哈顿计划需求而在美国Los Alamos实验室发展起来的,说白了就是美国为了造原子弹才逼出来的.Monte Carlo方法与一般的计算方法有很大的区别,一般计算方法对解决多维或因素复杂的问题非常困难,而Monte Carlo方法对解决这类问题却比较简单,因此Monte Carlo方法自从

排列和组合的求解

1)使用“分类计数原理”还是“分步计数原理”要根据我们完成某件事时采取的方式而定,可以分类来完成这件事时用“分类计数原理”,需要分步来完成这件事时就用“分步计数原理”:那么,怎样确定是分类,还是分步骤?“分类”表现为其中任何一类均可独立完成所给的事件,而“分步”必须把各步骤均完成才能完成所给事件,所以准确理解两个原理强调完成一件事情的几类办法互不干扰,相互独立,彼此间交集为空集,并集为全集,不论哪类办法都能将事情单独完成,分步计数原理强调各步骤缺一不可,需要依次完成所有步骤才能完成这件事,步与步

程序员的量化交易之路(3)--Esper事件Event(2)

第二章 EventPresentation 事件描述 欢迎转载学习,但转载须注明出处:http://blog.csdn.net/minimicall,尊重劳动成果,版权归我. 这一章用于说明事件描述和建模的方法. Esper 使用event type(事件类型)来描述事件的类型信息. 你的应用可以在Esper启动时或者在运行时通过API或者EPL语法来添加事件类型.具体参见16.4节"条目配置",关于启动时配置,15.3.8"运行时配置",关于运行时配置API. E

移动端点击事件全攻略,有你知道与不知道的各种坑

看标题的时候你可能会想,点击事件有什么好说的,还写一篇攻略?哈哈,如果你这么想,只能说明你too young to simple. 接触过移动端开发的同学可能都会面临点击事件的第一个问题:click事件的300ms延迟响应.不能立即响应给体验造成了很大的困扰,因此解决这个问题就成为了必然. 这个问题的解决方案就是: zepto.js的tap事件.tap事件可以理解为在移动端的click事件,而zepto.js因为几乎完全复制jQuery的api,因此常常被用在h5的开发上用来取代jquery.

js监控微信浏览器的自带的返回事件

pushHistory(); window.addEventListener("popstate", function(e) { e.preventDefault(); //alert("我监听到了浏览器的返回按钮事件啦"); //根据自己的需求实现自己的功能 //window.location = 'http://www.baidu.com'; pushHistory(); }, false); function pushHistory() { var state

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

touchstart和touchend事件

touchstart和touchend事件 移动互联网是未来的发展趋势,现在国内很多互联网大佬都在争取移动这一块大饼,如微信及支付宝是目前比较成功的例子,当然还有各种APP和web运用. 由于公司的需要,最近也在开发移动web,对于一个没有移动开发经验的人来说,其实也是比较困恼的一件事情.对于移动web开发目前主要是基于webkit内核的浏览器.在webkit内核的环境下开发,你可以充分的运用html5+css3,还有它的一些私有属性.这让我很兴奋.可是,毕竟,对于一个长期习惯pc端做固定像素开

苹果手机输入中文不会触发onkeyup事件

今天同事的项目有这个问题,用我的安卓手机输入中文是ok的,但是苹果手机就不行 使用keyup事件检测文本框内容:  $('#keyup_i').bind('keyup', function(){         $('#keyup_s').text($(this).val());  } 本来是上面这种处理方式,现在改成下面这样就ok了 使用oninput以及onpropertychange事件检测文本框内容:  //先判断浏览器是不是万恶的IE,没办法,写的东西也有IE使用者       var