zoukankan      html  css  js  c++  java
  • 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();
    }

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

  • 相关阅读:
    轮叫调度(RoundRobin Scheduling)
    Python的Daemon管理器zdaemon
    How do you select a particular option in a SELECT element in jQuery? Stack Overflow
    元宵爬虫YuanXiaoSpider
    python 异步采集,网页爬虫编写 | 一步一步学python
    吉林省明日科技有限公司
    简单分析C之Curl模块同php的curl和python的pycurl模块的关系
    fputs
    v专用链接破解器 专用链接破解器
    crawler jd
  • 原文地址:https://www.cnblogs.com/qianthinkover/p/3776043.html
Copyright © 2011-2022 走看看