程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 通過代碼學習C#&.NET——委托使用(事件、定時處理)

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

編輯:C#入門知識

 代碼編寫及運行環境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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved