事件(Event)例如:最近的視覺中國‘黑洞事件’。我們大多數人(訂閱者)是通過XX平臺(發佈者)得知的這一消息,然後訂閱者A出售視覺中國的股票(觸發的方法),訂閱者B買入視覺中國的股票。 運行結果: ...
事件(Event)例如:最近的視覺中國‘黑洞事件’。我們大多數人(訂閱者)是通過XX平臺(發佈者)得知的這一消息,然後訂閱者A出售視覺中國的股票(觸發的方法),訂閱者B買入視覺中國的股票。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 7 namespace ConsoleEvent 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //實例化一個事件對象 14 Media eventSource = new Media("視覺中國:黑洞也是我們家的!"); 15 16 //實例化關註事件的對象(訂閱者) 17 StupiderOne obj1 = new StupiderOne(); 18 StupiderTwo obj2 = new StupiderTwo(); 19 20 //使用委托把對象及其方法註冊到事件中 21 eventSource.BlackHoleEvent += new BlackHoleEventHandle(obj1.SendStock); 22 eventSource.BlackHoleEvent += new BlackHoleEventHandle(obj2.BuyStock); 23 24 //事件到了觸發黑洞事件,事件的調用 25 eventSource.TimeUp(); 26 Console.Read(); 27 } 28 } 29 30 //第一步:定義一個類型用來保存所有需要發送給事件接收者的附加信息 31 public class BlackHoleEventArgs : EventArgs 32 { 33 //表示事件的內容 34 private readonly string content; 35 36 public string Content 37 { 38 get { return content; } 39 } 40 41 public BlackHoleEventArgs(string content) 42 { 43 this.content = content; 44 } 45 } 46 47 //第二步:定義一個黑洞事件,首先需要定義一個委托類型,用於指定事件觸發時調用的方法類型 48 public delegate void BlackHoleEventHandle(object sender, BlackHoleEventArgs e); 49 //定義事件成員 50 public class Subject 51 { 52 //定義黑洞事件 53 public event BlackHoleEventHandle BlackHoleEvent; 54 55 //第三步:定義一個負責引發事件的方法,它通知已關註的對象 56 protected virtual void Notify(BlackHoleEventArgs e) 57 { 58 //出於線程安全的考慮,現在將對委托欄位的引用複製到一個臨時欄位中 59 BlackHoleEventHandle temp = Interlocked.CompareExchange(ref BlackHoleEvent, null, null); 60 if (temp != null) 61 { 62 //觸發事件,與方法的使用方式相同 63 //事件通知委托對象,委托對象調用封裝的方法 64 temp(this,e); 65 } 66 } 67 } 68 69 //定義觸發事件的對象,事件源 70 public class Media : Subject 71 { 72 private string content; 73 public Media(string content) 74 { 75 this.content = content; 76 } 77 public void TimeUp() 78 { 79 BlackHoleEventArgs eventarg = new BlackHoleEventArgs(content); 80 //黑洞門來了,通知吃瓜們 81 this.Notify(eventarg); 82 } 83 } 84 85 //吃瓜對象 86 public class StupiderOne 87 { 88 public void SendStock(object sender, BlackHoleEventArgs e) 89 { 90 Console.WriteLine(e.Content + "呵呵,我要抓緊出售視覺中國的股票"); 91 } 92 } 93 94 //吃瓜對象 95 public class StupiderTwo 96 { 97 public void BuyStock(object sender, BlackHoleEventArgs e) 98 { 99 Console.WriteLine(e.Content + "嘿嘿,我要等視覺中國的股票跌到底後,買入它的股票"); 100 } 101 } 102 }
運行結果: