C#中事件处理的个人体会

2016-02-19 11:55 9 1 收藏

今天图老师小编要跟大家分享C#中事件处理的个人体会,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

作者: juky_huang 事件的简单解释:

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。

在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。

与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。

C#中使用事件需要的步骤:

创建一个委托
将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)
编写事件处理程序
利用编写的事件处理程序生成一个委托实例
把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件
C#中事件产生和实现的流程:

定义A为产生事件的实例,a为A产生的一个事件
定义B为接收事件的实例,b为处理事件的方法
A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
A通过事件列表中的委托对象将这个事件通知给B
B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
调用B.b方法完成事件处理
下面给出《C#入门经典》的例子,并做一定的解释:

//====================Connection.cs===========
//事件定义,也就是上面提到的A
//============================================
using System;
using System.Timers;

namespace Ch12Ex02
{
/// summary
/// Connection 的摘要说明。
/// /summary
/// 

public delegate void MessageHandler(string messageText);//创建一个委托---步骤1
public class Connection
{
public event MessageHandler MessageArrived;//将创建的委托和特定事件关联,在这里特定的事件为MessageArrived ---步骤2*/
/*上面这语句值得注意的地方是 MessageArrived方法被关联到MessageHandler上后,以后消息的传递就通过MessageHandler这个委托来实现,所以如果要能接收这个消息,就必须能支持MessageHandler这个委托,也就是要有一个和委托一样的签名 
private Timer pollTimer;
public Connection()
{
//
// TODO: 在此处添加构造函数逻辑
//
pollTimer=new Timer(100);
pollTimer.Elapsed+=new ElapsedEventHandler(CheckForMessage);
}

public void Connect()
{
pollTimer.Start();
}

public void Disconnect()
{
pollTimer.Stop();
}

public void CheckForMessage(object sender,ElapsedEventArgs e)
{
Console.WriteLine("Check for message.");
Random random=new Random();
if((random.Next(9)==0)&&(MessageArrived!=null))
{
MessageArrived("Hello Mum!");//程序编写者自己产生一个消息,消息的内容为Hello Mum!
}
}
}
}

//====================Display.cs===========
//接收事件的类,也就是上面提到的B
//=========================================
using System;

namespace Ch12Ex02
{
/// summary
/// Display 的摘要说明。
/// /summary
public class Display
{
public Display()
{
//
// TODO: 在此处添加构造函数逻辑
//

}

public void DisplayMessage(string message) //a事件的最终处理函数,即上面的B.b,在main函数中,我们会使用本函数实现一个委托实例,并且添加到A的MessageArrived事件列表中--步骤3
{
Console.WriteLine("Message Arrived:{0}",message);
}
}
}

//====================Class1.cs=================
//一个控制台可执行类,主要是使用上面两个类的实例
//==============================================
using System;

namespace Ch12Ex02
{
/// summary
/// Class1 的摘要说明。
/// /summary
class Class1
{
/// summary
/// 应用程序的主入口点。
/// /summary
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//

Connection myConnection=new Connection();
Display myDisplay=new Display();
myConnection.MessageArrived+=new MessageHandler(myDisplay.DisplayMessage);//把委托添加到当前A的事件列表中----步骤4和步骤5

myConnection.Connect();
Console.ReadLine();
}
}
}

值得注意的代码:
public delegate void MessageHandler(string messageText);//委托定义
public event MessageHandler MessageArrived;//定义一个事件,并且关联到一个委托上
myConnection.MessageArrived+=new MessageHandler(myDisplay.DisplayMessage);//产生一个委托实例,并通过+=运算符号添加到事件列表中 +=运算符号在这里非常的有用 

 

来源:http://www.tulaoshi.com/n/20160219/1599106.html

延伸阅读
在组件编程中对事件的理解是十分重要的,C# 中的事件是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。与事件联系最为紧密的,个人认为是委托.委托可以将方法引用封装在委托对象内。为了弄清组件-事件-委托三者的关系,本人用实际的例子来谈 谈小弟的理解。 首先创建一个Windows控件项目,添加如下控件样板。 ...
标签: Web开发
事件处理概述  事件处理是对象化编程的一个很重要的环节,没有了事件处理,程序就会变得很死,缺乏灵活性。事件处理的过程可以这样表示:发生事件 - 启动事件处理程序 - 事件处理程序作出反应。其中,要使事件处理程序能够启动,必须先告诉对象,如果发生了什么事情,要启动什么处理程序,否则这个流程就不能进行...
Common.cs: 代码如下: using System; using System.Collections.Generic; using System.Text; namespace DelegateAndEvent.App_Code { public class Common { //定义全局变量. public static string txt = ""; #region 定义方法 public string HelloCSharp(string name) { txt += "hello " + name;//这样做是为了看到委托可以执...
由于ToolBar控件中不提供单个按钮的事件,因此在这里利用toolBar1.Buttons集合的IndexOf()方法捕捉单个的按钮,将其事件发送给ToolBarButtonClickEventHandler处理器。 //初始化:以下是代码片段:this.toolBar1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick); //事件方法:以下是代码...
很多初学c#的朋友对于事件与接口感到迷惑不解,不明白它们之间的关系,下面我就用实例来简单的分析讲解一下。 事件,用event修饰符来代表一个事件,我们要创建一个C#事件必须按以下顺序来扫行: 1,创建或标识一个代表。比如下例中的 public delegate void dele(); //声明代表,delegate 关键字通知编译器 dele 是一个委托类...

经验教程

614

收藏

19
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部