一、回顾委托与事件的基础 (官网介绍)

  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 }
View Code

      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);
            }

        }
       
    }
}
View Code

三、这样设计的好处

  首先要明白一件事情:事件是多播委托,而事件(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);
            }
        }
View Code

  简单修改下订阅者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());

        }
View Code

  事件的注册不变: me.TestEventArgs += new DoPlay(OnDoPlay); 

  新增触发者的调用:
    me.OnPlayLOL(null, new EventArgs());
    me.OnPlayCF(null, new EventArgs());
    me.OnPlayVX(null, new EventArgs());

 

posted on 2020-06-16 16:55  一个人的梦,千万人的付出  阅读(432)  评论(0编辑  收藏  举报