1. 程式人生 > >通過程式碼學習C#&.NET——委託使用(事件、定時處理)

通過程式碼學習C#&.NET——委託使用(事件、定時處理)

 程式碼編寫及執行環境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秒會執行定時處理的方法。