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();
相关推荐
小码编匠12 小时前
WPF 中的高级交互通过右键拖动实现图像灵活缩放
后端·c#·.net
唐青枫19 小时前
C#.NET 定时任务与队列利器:Hangfire 完整教程
c#·.net
hez20101 天前
Runtime Async - 步入高性能异步时代
c#·.net·.net core·clr
mudtools2 天前
.NET驾驭Word之力:玩转文本与格式
c#·.net
唐青枫2 天前
C#.NET 数据库开发提速秘籍:SqlSugar 实战详解
c#·.net
mudtools2 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
侃侃_天下3 天前
最终的信号类
开发语言·c++·算法
echoarts3 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix3 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
大飞pkz3 天前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式