闲来无聊对于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#事件求解的更多相关文章

  1. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  2. robot framework程序运行过程中,遇到点击事件之后,未出现点击之后的效果(求解)

    1.click Element操作,在实际过程中偶然会出现,日志显示已点击成功,但是实际自动化页面,没有点击成功之后的操作 现象: 现象描述:程序执行到点击侧边栏的[人员信息]之后,日志显示已经点击成 ...

  3. ASP.NET服务器端事件利用MARQUEE实现正在处理效果

    前言:ASP.NET同仁们应该都遇到过当触发一个比较耗时的服务器端事件时,页面会处在一个等待的状态(即假死状态),用户体验非常不好,很容易造成用户二次点击,造成重复提交.至于解决方案自然是有的(问go ...

  4. c/c++求解图的关键路径 critical path

    c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...

  5. Java求解迷宫问题:栈与回溯算法

    摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个 ...

  6. 贪心算法求解活动安排<算法分析>

    一.实验内容及要求 1.要求按贪心算法原理求解问题: 2.要求手工输入s[10]及f[10],其中注意自己判断s[i]<f[i]: 3.要求显示所有活动及最优活动安排的i事件列表.二.实验步骤  ...

  7. OptaPlanner 7.32.0.Final版本彩蛋 - SolverManager之异步求解

    因为工作和其它原因,很长一段时间没有出新的.关于OptaPlanner的文章了,但工余时间并没有停止对该引擎的学习.与此同时Geoffrey大神带领的KIE项目团队并没有闲下来,尽管在工业可用性.易用 ...

  8. 论文笔记——事件抽取之DMCNN

    1.事件抽取介绍: 事件在不同领域中有着不同的含义,对于事件目前还没有统一的定义.在IE ( Information Extraction) 中,事件是指在某个特定的时间片段和地域范围内发生的,由一个 ...

  9. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

随机推荐

  1. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  2. sql 子查询stuff功能(同一个人的多任务,多领域成为字符串)

    USE [erp2015] GO /****** Object: StoredProcedure [dbo].[GetUser] Script Date: 03/14/2015 13:27:04 ** ...

  3. Android而一个超级漂亮的日历控件

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  5. mysql_常用命令

    1: 以指定编码创建数据库 CREATE DATABASE `search_data` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

  6. 百度地图API 添加自定义标注 多点标注

    原文:百度地图API 添加自定义标注 多点标注 分四个文件 location.php map.css 图片 数据库 数据库配置自己改下 -------------------------------- ...

  7. NDMCDB数据库hang住故障分析 - cursor: pin S wait on X

    问题描写叙述: 上午刚刚到办公室,就有监控人员邮件反馈,昨晚NDMCDB407数据库被重新启动过,让我分析一下数据库重新启动的原因.因为昨晚业务有版本号上线,所以短信警告关闭了,所以没有短信下发到我手 ...

  8. timesten备份和恢复

    ttIsql "DSN=ttwind;UID=cacheuser;PWD=cacheuser;OraclePWD=cacheuser;" --1.查看当前版本号 Command&g ...

  9. 教你一步一步部署.net免费空间OpenShift系列之二------创建应用

    接上回书,注册完毕后需要在Openshift上创建一个应用空间,如如何创建空间呢,Openshift本身是不直接支持Mono来部署ASP.Net程序的,需要借助openshift-community- ...

  10. 西门子PLC学习笔记8-(计时器)

    计时器port这包括:信号输入.时间.复位信号.出口.[计时器剩余时间(BI二进制表示法.BCD码表示)其输出被存储MW] 定时器包括::S_PULSE(脉冲定时器).S_PEXT(延时脉冲定时器). ...