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

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

    }
}

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

    }
}

// 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();


猜你喜欢

转载自blog.csdn.net/u011511086/article/details/132319682