当前位置:  编程技术>.net/c#/asp.net

C# 事件处理学习心得

    来源: 互联网  发布时间:2014-08-30

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

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

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

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

2、C#中事件产生和实现的流程:
定义A为产生事件的实例,a为A产生的一个事件
定义B为接收事件的实例,b为处理事件的方法
A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
A通过事件列表中的委托对象将这个事件通知给B
B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
调用B.b方法完成事件处理

示例,有详细的注释。
 

代码示例:

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

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

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
{
///
/// Display 的摘要说明。
///
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
{
///
/// Class1 的摘要说明。
///
class Class1
{
///
/// 应用程序的主入口点。
///
[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);//产生一个委托实例,并通过+=运算符号添加到事件列表中 +=运算符号在这里非常的有用


    
 
 

您可能感兴趣的文章:

  • C# DoubleClick与MouseDoubleClick区别,双击事件引发顺序
  • C#中事件的继承实例分析
  • C#实现自定义双击事件
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • c# ListView实现双击Item事件的变通方法
  • C#事件处理和委托event delegate实例简述
  • C#中事件的动态调用实现方法
  • 解读在C#中winform程序响应键盘事件的详解
  • C# ListView双击Item事件
  • C#实现WinForm捕获最小化事件的方法
  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法
  • C# KeyUp事件中MessageBox的回车(Enter)键回调问题解决方案
  • c# 托盘双击不触发单击事件的实现方法
  • 不能在子类或外部类发布C#事件代码分析
  • C#控制台程序中处理2个关闭事件的代码实例
  • C#程序窗体间使用回调事件方式通讯示例
  • C#事件访问器详解
  • C# 中如何利用lambda实现委托事件的挂接
  • c#捕获windows关机事件的实现代码
  • c#事件使用示例详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python 3 Tkinter教程之事件Event绑定处理代码实例
  • 使用epoll lt或者et 每次wait到一个事件处理完后是否需要重新投递事件呢?
  • 关于java的事件问题,如何在程序中使一个button被click,从而引发这个button的事件处理代码????
  • jsp中怎样加入普通按钮的事件处理?
  • C#事件访问器详解 iis7站长之家
  • 异步事件处理库 libevent
  • JAVA事件处理
  • java的事件处理机制如何运用?
  • 事件处理规则语言 Prova
  • 怎么写ActiveX控件的事件处理函数?
  • 怎么处理这样的事件
  • 当一个窗口显示后,用鼠标拖动它的大小,怎样找到相应的事件处理函数?
  • jQuery的live()方法对hover事件的处理示例
  • gtk中的鼠标事件处理?
  • 老兄,帮我看看键盘事件处理的问题
  • 一个关于java事件处理的简单问题!
  • 事件处理小问题~~~~~~~~在线等!!
  • asp.net错误处理Application_Error事件示例
  • 单击和双击事件的冲突处理示例代码
  • asp.net错误捕获(错误处理)page_error事件使用方法
  • java页面设计之事件处理综合介绍
  • window.onload事件覆盖掉body onload事件(window.onload和html body onload事件冲突)解决办法
  • JQuery文本改变触发事件如聚焦事件、失焦事件
  • IOS开发:UIScrollView类介绍及如何简单地截获touch事件
  • 我的一个jComboBox下拉组件,在加入itemStateChanged()监听事件后速度就非常慢,我在事件响应部分没有加任何代码也是慢?去掉监听事件后就一切正常,为何?
  • 事件能传递吗,就是子类触发了一个鼠标事件,能不能也将这个鼠标事件发给父类
  • jquery阻止后续事件只执行第一个事件
  • 在JBuilder中窗体的什么事件与Delphi中的窗体的CloseQuery事件相同?
  • swing事件里怎么没有鼠标右键产生的事件?
  • jquery button默认enter事件(回车事件)
  • 我用画布(Canvas类)接受MouseEvent事件,但我又想这个事件的getX()方法返回的坐标是以窗口的原点为原点,该怎么办?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3