一、回顾委托与事件的基础 (官网介绍)
https://docs.microsoft.com/zh-cn/dotnet/csharp/delegates-overview------委托
https://docs.microsoft.com/zh-cn/dotnet/csharp/events-overview----------事件
二、程序设计
myEvent类中如下
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Threading.Tasks; 7 8 namespace TestThread 9 { 10 public class myEvent 11 { 12 /// <summary> 13 /// 声明一个委托播放 14 /// </summary> 15 /// <param name="sender"></param> 16 /// <param name="e"></param> 17 public delegate void DoPlay(Object sender, EventArgs e); 18 /// <summary> 19 /// 声明一个事件 用来订阅播放 20 /// </summary> 21 public event DoPlay TestEventArgs; 22 23 /// <summary> 24 /// 声明一个触发事件的方法 用于将数据打包 25 /// </summary> 26 /// <param name="sender"></param> 27 /// <param name="e"></param> 28 public void OnTestEventArgs(Object sender, EventArgs e) 29 { 30 if (e != null) 31 { 32 List<string> lst = new List<string>(); 33 lst.Add("Jack"); 34 lst.Add("LIU"); 35 lst.Add("Peng"); 36 lst.Add("Pick"); 37 TestEventArgs(lst, e); 38 } 39 } 40 } 41 }
main方法如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace TestThread { class Program:myEvent { public delegate void DoPlayGame(); public static event DoPlayGame DoPlayGameEventHander; public static void Main(string[] args) { myEvent me = new myEvent(); //me.TestPlayHanderEvent += Me_TestPlayHanderEvent; me.TestEventArgs += new DoPlay(OnDoPlay); //这里准备调用外部事件 注册事件 订阅 += 观察者 me.OnTestEventArgs(null,new EventArgs()); //调用触发者 Console.ReadKey(); } /// <summary> /// 开始播放事件传过来的数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void OnDoPlay(object sender, EventArgs e) { foreach (string item in (List<string>)sender) { Console.WriteLine(item); } } } }
三、这样设计的好处
首先要明白一件事情:事件是多播委托,而事件(Evnet)的触发后,其要使数据传递给需要观察者(Delegate) ,则需要一个函数或者说方法去订阅,我理解该函数为订阅者(代码中的OnDoPlay)
由此,我的理解就是在程序设计中,我们在外部类中声明了事件就可以很好地通过订阅者获取发生的”不同“事件,即实现多播委托。
这里就不讨论委托和事件的安全级别问题了。
四、验证多播委托
程序验证思路:既然我认为:在外部类中声明了事件就可以很好地通过订阅者获取发生的”不同“事件。由此我在myEvnet中在声明几个要发生的事件,比如OnPlayLOL、OnPlayCF、OnPlayVX
那么订阅者OnDoPlay就可以接收到这些事件的发生,即订阅事件的发生。运行程序:
代码构思如下:
TestEventArgs事件发生的方法:
public void OnPlayLOL(Object sender, EventArgs e) { if (e != null) { string str = "我正在玩LOL"; TestEventArgs(str, e); } } public void OnPlayCF(Object sender, EventArgs e) { if (e != null) { string str = "我正在玩CF"; TestEventArgs(str, e); } } public void OnPlayVX(Object sender, EventArgs e) { if (e != null) { string str = "我正在刷微信视频号"; TestEventArgs(str, e); } }
简单修改下订阅者OnDoPlay:
private static void OnDoPlay(object sender, EventArgs e) { if (sender is List<string>) { foreach (string item in (List<string>)sender) { Console.WriteLine(item); } } else Console.WriteLine(sender.ToString()); }
事件的注册不变: me.TestEventArgs += new DoPlay(OnDoPlay);
新增触发者的调用:
me.OnPlayLOL(null, new EventArgs());
me.OnPlayCF(null, new EventArgs());
me.OnPlayVX(null, new EventArgs());