C#中事件處理
2007/1/4 23:38:13

事件的簡單解釋:
事件是對象發(fā)送的消息,以發(fā)信號通知操作的發(fā)生。操作可能是由用戶交互(例如鼠標單擊)引起的,也可能是由某些其他的程序邏輯觸發(fā)的。引發(fā)(觸發(fā))事件的對象叫做事件發(fā)送方。捕獲事件并對其作出響應(yīng)的對象叫做事件接收方。
在事件通信中,事件發(fā)送方類不知道哪個對象或方法將接收到(處理)它引發(fā)的事件。所需要的是在源和接收方之間存在一個媒介(或類似指針的機制)。.NET Framework 定義了一個特殊的類型(Delegate),該類型提供函數(shù)指針的功能。
與其他的類不同,委托類具有一個簽名,并且它只能對與其簽名匹配的方法進行引用。這樣,委托就等效于一個類型安全函數(shù)指針或一個回調(diào)。
C#中使用事件需要的步驟:
創(chuàng)建一個委托
將創(chuàng)建的委托與特定事件關(guān)聯(lián)(.Net類庫中的很多事件都是已經(jīng)定制好的,所以他們也就有相應(yīng)的一個委托,在編寫關(guān)聯(lián)事件處理程序--也就是當有事件發(fā)生時我們要執(zhí)行的方法的時候我們需要和這個委托有相同的簽名)
編寫事件處理程序
利用編寫的事件處理程序生成一個委托實例
把這個委托實例添加到產(chǎn)生事件對象的事件列表中去,這個過程又叫訂閱事件
C#中事件產(chǎn)生和實現(xiàn)的流程:
定義A為產(chǎn)生事件的實例,a為A產(chǎn)生的一個事件
定義B為接收事件的實例,b為處理事件的方法
A由于用戶(程序編寫者或程序使用者)或者系統(tǒng)產(chǎn)生一個a事件(例如點擊一個Button,產(chǎn)生一個Click事件)
A通過事件列表中的委托對象將這個事件通知給B
B接到一個事件通知(實際是B.b利用委托來實現(xiàn)事件的接收)
調(diào)用B.b方法完成事件處理
下面給出《C#入門經(jīng)典》的例子,并做一定的解釋:
//====================Connection.cs===========
//事件定義,也就是上面提到的A
//============================================
using System;
using System.Timers;
namespace Ch12Ex02
{
/// <summary>
/// Connection 的摘要說明。
/// </summary>
/// 
public delegate void MessageHandler(string messageText);//創(chuàng)建一個委托---步驟1
public class Connection
{
public event MessageHandler MessageArrived;//將創(chuàng)建的委托和特定事件關(guān)聯(lián),在這里特定的事件為MessageArrived ---步驟2*/
/*上面這語句值得注意的地方是 MessageArrived方法被關(guān)聯(lián)到MessageHandler上后,以后消息的傳遞就通過MessageHandler這個委托來實現(xiàn),所以如果要能接收這個消息,就必須能支持MessageHandler這個委托,也就是要有一個和委托一樣的簽名
private Timer pollTimer;
public Connection()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
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!");//程序編寫者自己產(chǎn)生一個消息,消息的內(nèi)容為Hello Mum!
}
}
}
}
//====================Display.cs===========
//接收事件的類,也就是上面提到的B
//=========================================
using System;
namespace Ch12Ex02
{
/// <summary>
/// Display 的摘要說明。
/// </summary>
public class Display
{
public Display()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}
public void DisplayMessage(string message) //a事件的最終處理函數(shù),即上面的B.b,在main函數(shù)中,我們會使用本函數(shù)實現(xiàn)一個委托實例,并且添加到A的MessageArrived事件列表中--

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 欧美人与动性行为网站免费| 脱裙打光屁股打红动态图| 城中村找个白皙丰满妇女在线播放| 久久久夜间小视频| 欧美jizz18性欧美| 亚洲精品午夜国产va久久成人| 紧窄极品名器美妇灌| 国产午夜鲁丝片av无码免费| 在线视频网址免费播放| 大象视频在线免费观看| 中文国产成人精品久久96| 日本高清不卡码| 亚洲乱码卡三乱码新区| 欧美黑人又粗又大久久久| 免费吃奶摸下激烈视频| 紧扣的星星完整版免费观看| 国产人va在线| 国产小视频91| 国产精品国产三级国产AV′| 999这里只有精品| 夫前被强行侵犯在线观看| 与子的性关系在线播放中文版| 日本三级很黄试看120秒| 久久精品视频99| 欧美va天堂va视频va在线| 亚洲欧洲中文日韩久久av乱码| 爱情岛论坛亚洲永久入口口| 免费观看黄网站| 美女把屁股扒开让男人桶视频| 国产亚洲精品2021自在线| 黄色福利小视频| 国产无遮挡又黄又爽在线视频| 2020国产精品视频| 国内精品久久久久久久久齐齐 | eeuss免费影院| 川上优最新中文字幕不卡| 中文字幕无码免费久久| 日本h在线精品免费观看| 久久国产精品久久精品国产| 日韩电影中文字幕| 亚洲AV无码一区二区三区在线 |