zoukankan      html  css  js  c++  java
  • C# 事件机制

    在所有关于C#事件机制的介绍中,我更倾向于发布者/订阅者(Publisher/Subscriber)这种描述。理解事件机制并不是一件容易的事情,它所涉及的思想值得我们好好去研究。

    本文资源来自《C#与.NET技术平台实战演练》——中国青年出版社

    谈到事件,我们涉及到两个角色:事件发布者(Publisher)和事件订阅者(Scriber),也可以说是事件发送者(Sender)和事件接收者(Receiver)的关系。举个例子来说,市面上目前有许多杂志,杂志的种类也很多。而我只对其中的某些感兴趣,那么我就可以向杂志发行商提出订阅。之后,每当杂志发行时,我就会收到我在杂志发行商那儿订阅的杂志。在这个关系中,杂志发行商就相当于事件发行者,而我就是事件订阅者。每当杂志发行时,就触发了一个发行事件。

    用面向对象的语言解释,这两者的意义如下:

    事件发行者(Publisher)

    它是一个对象,且会维护自身的状态信息。每当状态信息发生变动时,便触发一个事件,并通知所有的事件订阅者。对于杂志发行商来说,每本杂志都有自己的信息在里面,当杂志发行时,我要通知订阅该杂志的人:杂志已经发行啦,请注意查收!

    事件接收者(Receiver)

    这个对象要注册它感兴趣的对象,也就是订阅它自己喜欢的杂志啦。另外,这个对象通常要提供一个事件处理方法,在事件发行者触发一个事件后,会自动执行这个方法。对于上面所举的例子来说,也就是我收到杂志后要做什么事情,比如,你可以满世界地大喊:我收到杂志啦!也可以将杂志收藏起来慢慢欣赏,具体怎么实现完全取决你自己的喜好。

    以下是.NET事件处理机制的模型:

    说明:可以注册多个事件处理程序

     

    下面给出一个例子:

    FileWatch.cs内容:

    using System;

    using System.Collections.Generic;

    using System.Linq;

     

    namespace WindowsFormsEventTest

    {

     

    // 1、委托 (指向函数的指针 类型)

    public delegate void FileChangedEventHandler(object sender, MyEventArgs e);

    class FileWatch

    {

    //2、事件 (指向函数的指针变量 ——FileChangedEvent)

    public event FileChangedEventHandler FileChangedEvent;

     

    //3、触发事件的方法

    public virtual void OnFileChange(MyEventArgs e)

    {

    if (FileChangedEvent != null)

    {

    FileChangedEvent(this, e);

    }

    }

    }

    }

     

    Form1.cs文件内容如下:

    using System;

    using System.Windows.Forms;

     

    namespace WindowsFormsEventTest

    {

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

     

            

    FileWatch EventSource = new FileWatch();//定义对象

     

    EventSource.FileChangedEvent += new FileChangedEventHandler(FileChangeHandle);//注册事件(为指针赋值) +=

    EventSource.FileChangedEvent += new FileChangedEventHandler(FileChangeHandle2);// 注册事件(为指针赋值)

     

    EventSource.OnFileChange(e);

    for (int i= 0; i < 500000000; ++i)

    {

    }

     

     

    EventSource.OnFileChange(e);

    for (int i = 0; i < 500000000; ++i)

    {

    }

    EventSource.OnFileChange(e);

    }

     

    public void FileChangeHandle(object obj,MyEventArgs e)

    {

    listBox1.Items.Add(DateTime.Now.ToString() + " : 文件发生改变." +"Message:"+e.Info);

    }

    public void FileChangeHandle2(object obj, MyEventArgs e)

    {

    listBox2.Items.Add(DateTime.Now.ToString() + " : 文件发生改变." + "Message:" + e.Info);

    }

     

    }

    }

  • 相关阅读:
    简述SQL with(unlock)与with(readpast)
    SQLServer 查询最近一天,三天,一周,一月,一季度数据的方法
    C# DevExpress GridControl使用方法
    SQL一列的合并连起来
    DevExpress Report打印边距越界问题
    C# 快速高效率复制对象另一种方式 表达式树
    SQL传数组到存储过程中
    LogNet4学习笔记
    使用Squid部署代理缓存服务(标准正向、透明正反向代理)
    使用Postfix与Dovecot收发电子邮件(物理机虚拟机之间)
  • 原文地址:https://www.cnblogs.com/liyanwei/p/4422363.html
Copyright © 2011-2022 走看看