C#防止事件重复注册

该代码示例展示了在C#中如何使用静态事件进行订阅和移除。`AddPage`类包含一个事件`ShowMsg`,提供了`TryAddEvent`和`TryRemoveEvent`方法来确保事件处理函数不会被重复注册或意外移除。`ListPageShow`类订阅了`ShowMsg`事件以执行分页展示操作,而`Main`方法中的`Qidong`函数也订阅了事件并在特定条件下移除。
摘要由CSDN通过智能技术生成
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Xml.Linq;

namespace ConsoleApp_Net5Test
{
    internal class AddPage
    {
        /// <summary>
        /// 事件,消息通知
        /// </summary>
        private static event EventHandler ShowMsg;

        /// <summary>
        /// 注册事件,防止重复注册
        /// </summary>
        /// <param name="handler"></param>
        public static void TryAddEvent(EventHandler handler)
        {
            if (ShowMsg == null)
            {
                goto DO_ADD;
            }
            Delegate[] delegates = ShowMsg.GetInvocationList();
            bool right = delegates.Any(g => g.Method == handler.Method);
            if (right)
            {
                return;
            }
        DO_ADD:
            ShowMsg += handler;
        }

        /// <summary>
        /// 移除订阅
        /// </summary>
        /// <param name="handler"></param>
        public static void TryRemoveEvent(EventHandler handler)
        {
            if (handler == null) { return; }
            Delegate[] delegates = ShowMsg.GetInvocationList();
            var find = delegates.FirstOrDefault(g => g.Method == handler.Method) as EventHandler;
            if (find != null)
            {
                ShowMsg -= find;
            }
        }

        /// <summary>
        /// 添加一条记录。
        /// </summary>
        /// <param name="id"></param>
        /// <param name="code"></param>
        /// <param name="color"></param>
        public void Add(int id, int code, string color)
        {
            //处理添加一条记录
            Console.WriteLine($"{id},{code},{color},添加一条记录" + DateTime.Now.ToShortTimeString());

            //通知所有订阅者,提示消息,
            ShowMsg?.Invoke(id, new EventArgs());

        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp_Net5Test
{
    internal class ListPageShow
    {
        public ListPageShow()
        {
            //AddPage.ShowMsg += delegate { PageShow(); };
            //AddPage.TryAddEvent(delegate { PageShow(); });
             
            //订阅事件 
            AddPage.TryAddEvent(PageShow);
        }

        static int count = 0;

        /// <summary>
        /// 分页展示
        /// </summary>
        public void PageShow(object obj, EventArgs eventArgs)
        {
            Console.WriteLine(obj.ToString() + "刷新数据列表" + " ," + DateTime.Now.Ticks);

            //if (count>0 && count % 2==0)
            //{
            //    //取消订阅事件
            //    AddPage.TryRemoveEvent(PageShow);
            //}

            count++;
        }

    }
}

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Linq;

namespace ConsoleApp_Net5Test
{
    class Program
    {

        public static void Qidong(object obj, EventArgs eventArgs)
        {
            Console.WriteLine(obj.ToString() + "武松打虎" + " " + DateTime.Now.Ticks);
        }
        
        static int count = 0;
        
        static void Main(string[] args)
        {

        AGAIN:
        	//订阅事件
            AddPage.TryAddEvent(Qidong);
            AddPage.TryAddEvent(delegate { Console.WriteLine("启动类触发" + " " + DateTime.Now.Ticks); });

            ListPageShow show = new ListPageShow();
            show.PageShow(1, new EventArgs());

            if (count > 0 && count % 2 == 0)
            {
                //取消订阅
                AddPage.TryRemoveEvent(show.PageShow);
            }

            AddPage addPage = new AddPage();
            //新增一条记录
            addPage.Add(999, 222, "红色");

            Console.WriteLine("");
            count++;
            goto AGAIN;
             
            Console.ReadLine();
        }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王焜棟琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值