C# 事件(Event)

C# 事件(Event)
事件(Event) 基本上說是一個用戶操作专缠,如按鍵雷酪、點擊、鼠標移動等等涝婉,或者是一些提示信息哥力,如系統(tǒng)生成的通知。應用程序需要在事件發(fā)生時響應事件墩弯。例如吩跋,中斷。

C# 中使用事件機制實現(xiàn)線程間的通信

通過事件使用委托
事件在類中聲明且生成渔工,且通過使用同一個類或其他類中的委托與事件處理程序關聯(lián)锌钮。包含事件的類用于發(fā)布事件。這被稱為 發(fā)布器(publisher) 類涨缚。其他接受該事件的類被稱為 訂閱器(subscriber) 類轧粟。事件使用 發(fā)布-訂閱(publisher-subscriber) 模型。

發(fā)布器(publisher) 是一個包含事件和委托定義的對象脓魏。事件和委托之間的聯(lián)系也定義在這個對象中兰吟。發(fā)布器(publisher)類的對象調用這個事件,并通知其他的對象茂翔。

訂閱器(subscriber) 是一個接受事件并提供事件處理程序的對象混蔼。在發(fā)布器(publisher)類中的委托調用訂閱器(subscriber)類中的方法(事件處理程序)。

聲明事件(Event)

在類的內部聲明事件珊燎,首先必須聲明該事件的委托類型惭嚣。例如:

public delegate void BoilerLogHandler(string status);

然后,聲明事件本身悔政,使用 event 關鍵字:

// 基于上面的委托定義事件
public event BoilerLogHandler BoilerEventLog;

上面的代碼定義了一個名為 BoilerLogHandler 的委托和一個名為 BoilerEventLog 的事件晚吞,該事件在生成的時候會調用委托。

namespace SimpleEvent {
    using System;
    /***********發(fā)布器類***********/
    public class EventTest {
        private int value;

        public delegate void NumManipulationHandler ();


        public event NumManipulationHandler ChangeNum;

        protected virtual void OnNumChanged () {
            if (ChangeNum != null) {
                ChangeNum(); /* 事件被觸發(fā) */
            } else {
                Console.WriteLine("event not fire");
                Console.ReadKey(); /* 回車繼續(xù) */
            }
        }


        public EventTest () {
            SetValue(5);
        }


        public void SetValue (int n) {
            if (value != n) {
                value = n;
                OnNumChanged();
            }
        }
    }

    /***********訂閱器類***********/

    public class subscribEvent {
        public void printf () {
            Console.WriteLine("event fire");
            Console.ReadKey(); /* 回車繼續(xù) */
        }
    }

    /***********觸發(fā)***********/
    public class MainClass {
        public static void Main () {
            EventTest e = new EventTest(); /* 實例化對象,第一次沒有觸發(fā)事件 */
            subscribEvent v = new subscribEvent(); /* 實例化對象 */

            e.ChangeNum += new EventTest.NumManipulationHandler(v.printf); /* 注冊 */
            e.SetValue(7);
            e.SetValue(11);
        }
    }
}

案例2:

using System;
using System.IO;

namespace BoilerEventAppl
{

   // boiler 類
   class Boiler
   {
      private int temp;
      private int pressure;
      public Boiler(int t, int p)
      {
         temp = t;
         pressure = p;
      }

      public int getTemp()
      {
         return temp;
      }
      public int getPressure()
      {
         return pressure;
      }
   }
   // 事件發(fā)布器
   class DelegateBoilerEvent
   {
      public delegate void BoilerLogHandler(string status);

      // 基于上面的委托定義事件
      public event BoilerLogHandler BoilerEventLog;

      public void LogProcess()
      {
         string remarks = "O. K";
         Boiler b = new Boiler(100, 12);
         int t = b.getTemp();
         int p = b.getPressure();
         if(t > 150 || t < 80 || p < 12 || p > 15)
         {
            remarks = "Need Maintenance";
         }
         OnBoilerEventLog("Logging Info:\n");
         OnBoilerEventLog("Temparature " + t + "\nPressure: " + p);
         OnBoilerEventLog("\nMessage: " + remarks);
      }

      protected void OnBoilerEventLog(string message)
      {
         if (BoilerEventLog != null)
         {
            BoilerEventLog(message);
         }
      }
   }
   // 該類保留寫入日志文件的條款
   class BoilerInfoLogger
   {
      FileStream fs;
      StreamWriter sw;
      public BoilerInfoLogger(string filename)
      {
         fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
      }
      public void Logger(string info)
      {
         sw.WriteLine(info);
      }
      public void Close()
      {
         sw.Close();
         fs.Close();
      }
   }
   // 事件訂閱器
   public class RecordBoilerInfo
   {
      static void Logger(string info)
      {
         Console.WriteLine(info);
      }//end of Logger

      static void Main(string[] args)
      {
         BoilerInfoLogger filelog = new BoilerInfoLogger("e:\\boiler.txt");
         DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();
         boilerEvent.BoilerEventLog += new 
         DelegateBoilerEvent.BoilerLogHandler(Logger);
         boilerEvent.BoilerEventLog += new 
         DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);
         boilerEvent.LogProcess();
         Console.ReadLine();
         filelog.Close();
      }//end of main

   }//end of RecordBoilerInfo
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谋国,一起剝皮案震驚了整個濱河市槽地,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦瘾,老刑警劉巖捌蚊,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異近弟,居然都是意外死亡缅糟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門祷愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗宦,“玉大人,你說我怎么就攤上這事谣辞∑人ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵泥从,是天一觀的道長句占。 經常有香客問我,道長躯嫉,這世上最難降的妖魔是什么纱烘? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮祈餐,結果婚禮上擂啥,老公的妹妹穿的比我還像新娘。我一直安慰自己帆阳,他們只是感情好哺壶,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般山宾。 火紅的嫁衣襯著肌膚如雪至扰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天资锰,我揣著相機與錄音敢课,去河邊找鬼。 笑死绷杜,一個胖子當著我的面吹牛直秆,可吹牛的內容都是我干的。 我是一名探鬼主播鞭盟,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼圾结,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了齿诉?” 一聲冷哼從身側響起疫稿,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹃两,沒想到半個月后遗座,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡俊扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年途蒋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋记。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡号坡,死狀恐怖,靈堂內的尸體忽然破棺而出梯醒,到底是詐尸還是另有隱情宽堆,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布茸习,位于F島的核電站畜隶,受9級特大地震影響,放射性物質發(fā)生泄漏号胚。R本人自食惡果不足惜籽慢,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猫胁。 院中可真熱鬧箱亿,春花似錦、人聲如沸弃秆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脑豹,卻和暖如春氢卡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晨缴。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峡捡,地道東北人击碗。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像们拙,于是被迫代替她去往敵國和親稍途。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容

  • 之前講過了委托砚婆,要了解委托可以看之前講委托的那一節(jié)http://www.reibang.com/p/64416b...
    滿苑繁花閱讀 1,868評論 0 0
  • C#(發(fā)音為 C sharp械拍,正確寫法應為 C?),是一種簡單装盯、現(xiàn)代坷虑、通用、面向對象的編程語言埂奈,支持跨平臺迄损。支持結...
    神齊閱讀 2,601評論 0 3
  • 源碼路徑:Github-EventBus事件總線知多少(1)事件總線知多少(2) 1. 引言 事件總線這個概念對你...
    圣杰閱讀 11,886評論 9 41
  • 在圖形界面中的運用程序中,通常是主線程負責UI人機交互账磺,而將需要循環(huán)執(zhí)行和耗資源的邏輯代碼和復雜的業(yè)務實現(xiàn)以及數(shù)據(jù)...
    桂慧要努力當個攻城師閱讀 14,625評論 7 14
  • ---初級---一芹敌、C#簡介: C# 是一個簡單的、現(xiàn)代的垮抗、通用的氏捞、面向對象的編程語言,它是由微軟(Microso...
    張中華閱讀 1,085評論 0 2