代碼編寫及運行環境Visual Studio 2010 .NET v4.0.30319
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;//定時處理需要引用
namespace DelegateUseInEvent
{
/// <summary>
/// 事件要是標示一個對象在一定條件下會運行的方法列表,其使用委托實現;
/// 定時處理則是通過Timer的定時功能來實現在時間間隔內處理各種任務和方法的一種機制,其也采用委托實現。
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine("當前托管線程ID為:" + Thread.CurrentThread.ManagedThreadId);
EventEx();
TimerEx();
Console.ReadKey();//此處為了保證定時器能順利執行,不然主線程運行結束則程序結束,定時器是不會運行的
}
#region 事件中的委托
/// <summary>
/// 此處模擬一個燒水的過程,其中把需要燒的水定義為一個類(BoilingWater),其中提供一個溫度屬性
/// 隨著溫度的改變,如果達到100度的沸點,則觸發定義的事件(WaterBoiled)。
/// 而在實際執行時則給事件添加了兩個模擬方法,一個模擬通知,一個模擬關閉燒水用電源
/// </summary>
static void EventEx()
{
BoilingWater etc = new BoilingWater();
etc.WaterBoiled += etc_BoiledTest;//給類實例添加水沸騰的模擬方法
etc.WaterBoiled += etc_BoiledTest2;//給類實例添加關閉電源的模擬方法
for (int i = 98; i < 102; i++)//通過給對象溫度賦值模擬燒水過程,
{
Console.WriteLine("給對象設置的溫度為:" + i);
etc.Temperature = i;
}
}
//事件需調用方法一
static void etc_BoiledTest(object o, EventArgs e)
{
BoilingWater SourceObject = (BoilingWater)o;
Console.WriteLine("*********執行方法一*********");
Console.WriteLine("通知:水已經沸騰!水的溫度為:"+SourceObject.Temperature);
Console.WriteLine("托管線程ID為:" + Thread.CurrentThread.ManagedThreadId);
}
//事件都調用方法二
static void etc_BoiledTest2(object o, EventArgs e)
{
BoilingWater SourceObject =(BoilingWater)o;
Console.WriteLine("*********執行方法二*********");
Console.WriteLine("操作:關閉電源!水的溫度為:" + SourceObject.Temperature);
}
//定義對象即其支持的事件
class BoilingWater
{
public delegate void EventTest(object o, EventArgs e);
public event EventTest WaterBoiled;//定義一個事件,
private int _Temperature;
public int Temperature//定義一個溫度屬性
{
get
{
return _Temperature;
}
set
{
_Temperature = value;
if (value == 100)//若水達到100度即沸騰則觸發事件
{
OnEventTest();
}
}
}
//觸發事件的過程
private void OnEventTest()
{
if (WaterBoiled != null)//觸發事件時先判斷是否為空
{
WaterBoiled(this, new EventArgs());
}
}
}
#endregion
#region 定時處理中的委托
/// <summary>
/// .NET的System.Threading中提供了定時器,並且提供了回調委托類型(TimerCallback),以實現定時處理
/// </summary>
static void TimerEx()
{
//TimerCallback是指向一個object類型參數的無返回值方法的委托,供定時器回調使用
TimerCallback timerCallback = new TimerCallback(Method1);//把Method1的方法加入委托中
timerCallback += o => { Console.WriteLine("定時調用方法:Lambda表達式方法"); };//把lambda表達式加入委托中
timerCallback += delegate(object o)//把匿名方法加入到委托中
{
Console.WriteLine("定時調用方法:匿名方法");
};
//使用定時器定時調用委托中引用的方法
Timer timer = new Timer(timerCallback,//參數定義定時時處理的方法或方法列表(以委托實現)
null, //此參數定義傳遞給方法的object類型參數,用null表明不傳遞參數
0, //此參數表明定時器開始的時間,0標示理解開始
1000); //此參數標示定時處理的事件間隔,以毫秒為單位
}
//定義定時處理的方法
static void Method1(object o)
{
Console.WriteLine("定時調用方法:Method1;執行時間:"+DateTime.Now.ToLongTimeString());
Console.WriteLine("托管線程ID為:" + Thread.CurrentThread.ManagedThreadId);
}
#endregion
}
}
運行結果及說明:說明事件是在主線程中運行,定時處理的處理方法則是和任務處理方式一樣,及在線程池中申請線程在後台進行處理;若程序中不按任意鍵,會一直運行下去,並且每1秒會運行定時處理的方法。
摘自:gxmark的專欄