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

这篇具有很好参考价值的文章主要介绍了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();


文章来源地址https://www.toymoban.com/news/detail-658567.html

到了这里,关于c#防止事件重复注册,调用后就移除注册,跨程序集的事件订阅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 面试题 02.01. 移除重复节点

      编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。   点击此处跳转题目。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2] 提示: 链表长度在[0, 20000]范围内。 链表元素在[0, 20000]范围内。 进阶: 如果不得使用临时缓冲

    2024年02月11日
    浏览(27)
  • GTK防止gtk_container_remove移除组件后被销毁

    gtk_container_remove移除容器内组件 为了移除后还可以继续使用组件,使用g_object_ref增加对象的引用计数 与之对应的是g_object_unref,减少对象引用计数,释放对象

    2024年02月12日
    浏览(34)
  • 前端如何防止接口重复提交

    接口重复提交指的是在网络通信中,同一个请求被客户端多次发送到服务器端的情况。这种情况可能由于多种原因导致,例如用户在等待期间多次点击提交按钮、网络超时后客户端重新发送请求、客户端发送的请求在网络传输过程中出现重复等。 接口重复提交可能会导致多种

    2024年04月22日
    浏览(27)
  • 如何防止订单重复支付

    想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付。 看看订单支付流程 我们来看看,电商订单支付的简要流程: 订单钱包支付流程 从下单/计算开始: 下单/结算 :这一步虽然不是直接的支付起点,但是支付相关的金额等等信息都来自结算,此时订单的

    2024年02月05日
    浏览(32)
  • springBoot防止重复提交

    两种方法, 一种是后端实现,较复杂,要通过自定义注解和AOP以及Redis组合实现 另一种是前端实现,简单,只需通过js,设置过期时间,一定时间内,多次点击按钮只生效一次 自定义注解+AOP+Redis 自定义异常类和全局异常处理 自定义异常类:CustomException 全局异常处理:Cust

    2024年02月11日
    浏览(30)
  • 防止重复提交请求

    前景提要: ts 简易封装 axios,统一 API 实现在 config 中配置开关拦截器 axios 实现请求 loading 效果 用一个数组保存当前请求的 url,此时还未响应。如果再次发起同样请求,比对 url 发现已经存在数组中,则拦截请求,提示重复提交。当该请求响应结束后,就将 url 从数组中剔除

    2024年02月06日
    浏览(29)
  • java防止重复提交的方法

      为了防止重复提交,可以采用以下几种方法: 1. 令牌机制(Token) 在表单中添加一个隐藏字段,用于存放一个随机生成的令牌(Token)。当用户提交表单时,将令牌一起提交到服务器。服务器接收到请求后,首先检查令牌是否存在,如果不存在则拒绝请求;如果存在,则将

    2024年02月01日
    浏览(28)
  • 微信小程序防止重复提交

    微信小程序在真机测试时,遇到这样一种情况:当网络条件差或卡顿的情况下,进行某项操作时,使用者会认为点击无效而进行多次点击,致使多次跳转页面或多次上传同一表单,导致函数或接口被多次调用,实际上使用者只想调用函数和接口一次。 添加节流阀,即按下按钮

    2024年02月13日
    浏览(37)
  • 聊聊大厂都怎么防止重复下单?

    一、问题背景 最简单的:DB 事务。如创建订单时,同时往订单表、订单商品表插数据,这些 Insert 须在同一事务执行。 Order 服务调用 Pay 服务,刚好网络超时,然后 Order 服务开始重试机制,于是 Pay 服务对同一支付请求,就接收到了两次,而且因为轮询负载均衡算法,落在了

    2024年02月11日
    浏览(37)
  • C++中防止头文件重复包含处理办法

    首先给出可以拷贝的模板: 在小型项目中,如果将函数的定义写在 main 函数的后面,那么需要在 main 函数前面加上这个函数的声明才可以顺利运行成功。 当然如果你不想写函数声明也可以,将函数的定义放在 main 函数前面即可。 但是在大项目中一般不会这么写,那得多少个

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包