通過程式碼學習C#&.NET——委託使用(事件、定時處理)
阿新 • • 發佈:2019-02-12
程式碼編寫及執行環境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秒會執行定時處理的方法。