c#防止事件重复注册,调用后就移除注册,跨程序集的事件订阅

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppNET7
{
    public class UploadFile
    {

        static UploadFile()
        {
            Task.Run(() =>
            {
                while (true)
                {
                    try
                    {
                        Delegate[] delegates = ImgCalcAmount.GetInvocationList();
                        Console.Out.WriteLine("注册事件数" + delegates.Length);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("事件数量为0,获取异常," + ex.Message);
                        break;
                    }

                    Thread.Sleep(100);
                }
            });
        }
 
        /// <summary>
        /// 小图片数量,通知
        /// </summary>
        public static event EventHandler<string> ImgCalcAmount;

        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="html"></param>
        /// <param name="articleId"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public static async Task<Dictionary<string, string>> UploadFileWork(string html, string articleId, string user)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>();
 
            await Task.Delay(100);
 
            //计算小图数量
            int count = int.Parse(articleId.Last().ToString()) + 1;
            for (int i = 0; i < count; i++)
            {
                if (count % 2 == 0)
                {
                    await Task.Delay(3000);
                }
                if (count % 3 == 0)
                {
                    await Task.Delay(1000);
                }

                //找到一张小图片,通知调用方,小图数量 +1
                ImgCalcAmount?.Invoke(1, articleId);
            }
            return dict;
        }

    }
}
csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppNET7
{
    internal class BusinessTest
    {

        public static async Task PublishArticle(string articleId)
        {
            short imgAmount = 0; /* 小图数量计数 */
            EventHandler<string> action = (o, e) =>
            {
                if (e == articleId)
                {
                    imgAmount = (short)(imgAmount + 1);
                }
            }; 
            UploadFile.ImgCalcAmount += action;

            //上传文件处理
            await UploadFile.UploadFileWork("文章内容html", articleId, "李斯");

            //移除注册
            UploadFile.ImgCalcAmount -= action;

            //上传完成;     
            Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")},文章{articleId},小图片数{imgAmount}");
             
        }

    }
}
csharp 复制代码
// See https://aka.ms/new-console-template for more information
using ClassLibrary.Tool;
using ConsoleAppNET7;

Console.WriteLine("Hello, World!");

//
for (int i = 0; i < 10; i++) {
    BusinessTest.PublishArticle("1000"+i);
}

Task.Delay(2000).Wait();

for (int i = 0; i < 10; i++)
{
    BusinessTest.PublishArticle("2000" + i);
}
 
Console.WriteLine("程序结束----");
Console.ReadKey();
相关推荐
SilentSamsara16 分钟前
生成器完全指南:`yield` 与惰性求值的工程价值
linux·开发语言·python·算法·机器学习·青少年编程
jieyucx8 小时前
Go语言深度解剖:Map扩容机制全解析(增量扩容+等量扩容+渐进式迁移)
开发语言·后端·golang·map·扩容策略
顾温8 小时前
default——C#/C++
java·c++·c#
InCerry8 小时前
.NET性能优化:提升Apache Arrow读写性能
c#·.net周刊
脏脏a8 小时前
【C++模版】泛型编程:代码复用的终极利器
开发语言·c++·c++模版
island13148 小时前
【C++仿Muduo库#3】Server 服务器模块实现上
服务器·开发语言·c++
散峰而望8 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
小龙报8 小时前
【C语言】内存里的 “数字变形记”:整数三码、大小端与浮点数存储真相
c语言·开发语言·c++·创业创新·学习方法·visual studio
深耕AI8 小时前
【VS Code避坑指南】点击Python图标提示“没有Python环境”,选择安装uv后这堆输出到底是什么意思?
开发语言·python·uv
2301_789015628 小时前
C++:继承
c语言·开发语言·c++