C#不会循环响应的Action设计与实现

目录

一、简述

特点:

  • 不光是能防止直接的死循环调用;
  • 还能防止间接的死循环调用;
  • 还支持对不同参数判定,不同参数的调用可以不当循环调用;

消息事件系统中必备,拒绝死循环

简明、高效、实用

其它编程语言也可以参考实现

二、测试代码

测试代码只为展示组件功能,也完美的展示组件功能。测试用例是完全的

csharp 复制代码
using UnityEngine;

namespace Main
{
    /// <summary>
    /// 将脚本挂到一个空对象上即可测试
    /// </summary>
    public class SimpleTest_NonLoopAction : MonoBehaviour
    {
        private void Start()
        {
            // 测试逻辑: [->A ->A]
            Logic01.Run();

            // 测试逻辑:[->A ->B ->C ->A]
            Logic02.Run();

            // 测试逻辑:[->A ->A(1) ->A(1,2) ->A(1,2,3) ->A(1)]
            // (注:中间相同的消息但参数不一样,只有出现一样的参数的消息,都会中断)
            Logic03.Run();
        }

        static class Logic01
        {
            static NonLoopAction _nonLoopActionA;

            /// <summary>
            /// 执行逻辑 [->A ->A]
            /// </summary>
            public static void Run()
            {
                Debug.Log("===== Logic01: [->A ->A] ===========");
                _nonLoopActionA = new NonLoopAction(OnResponseA, "A消息响应者", true);
                _nonLoopActionA.Invoke();
            }
            static void OnResponseA(params object[] args)
            {
                Debug.Log("==> On Response A");
                _nonLoopActionA.Invoke();
            }
        }

        static class Logic02
        {
            static NonLoopAction _nonLoopActionA;
            static NonLoopAction _nonLoopActionB;
            static NonLoopAction _nonLoopActionC;

            /// <summary>
            /// 执行逻辑:[->A ->B ->C ->A]
            /// </summary>
            public static void Run()
            {
                Debug.Log("===== Logic02: [->A ->B ->C ->A] ===========");
                _nonLoopActionA = new NonLoopAction(OnResponseA, "A消息响应者", true);
                _nonLoopActionB = new NonLoopAction(OnResponseB, "B消息响应者", true);
                _nonLoopActionC = new NonLoopAction(OnResponseC, "C消息响应者", true);
                _nonLoopActionA.Invoke();
            }
            static void OnResponseA(params object[] args)
            {
                Debug.Log("==> On Response A");
                _nonLoopActionB.Invoke();
            }
            static void OnResponseB(params object[] args)
            {
                Debug.Log("==> On Response B");
                _nonLoopActionC.Invoke();
            }
            static void OnResponseC(params object[] args)
            {
                Debug.Log("==> On Response C");
                _nonLoopActionA.Invoke();
            }
        }

        static class Logic03
        {
            static NonLoopAction _nonLoopActionA;

            /// <summary>
            /// 执行逻辑:[->A ->A(1) ->A(1,2) ->A(1,2,3) ->A(1)]
            /// (注:中间相同的消息但参数不一样,只出现一样的参数的消息,都会中断)
            /// </summary>
            public static void Run()
            {
                Debug.Log("===== Logic03: [->A ->A(1) ->A(1,2) ->A(1,2,3) ->A(1)] ===========");
                _nonLoopActionA = new NonLoopAction(OnResponseA, "A消息响应者", true);
                _nonLoopActionA.Invoke();//A
            }
            static void OnResponseA(params object[] args)
            {
                Debug.Log("==> On Response A");
                int args_count = args.Length;
                if (args_count == 0)
                {
                    _nonLoopActionA.Invoke(1);//A(1)
                }
                else if (args_count == 1)
                {
                    _nonLoopActionA.Invoke(1,2);//A(1,2)
                }
                else if (args_count == 2)
                {
                    _nonLoopActionA.Invoke(1,2,3);//A(1,2,3)
                }
                else if (args_count == 3)
                {
                    _nonLoopActionA.Invoke();//A
                }
            }
        }
    }
}

三、测试的输出



四、核心代码

这是本人在几十个中大型中商业项目中使用的组件,高效稳定,放心拍下来,学习与使用。

绝对原创、尊重原创
赏点零花钱 2元

【淘宝】https://m.tb.cn/h.5oRdsNlaKTEquN5?tk=awCzWhaDRoQ CZ0001 「C#不会循环响应的Action设计与实现」
点击链接直接打开 或者 淘宝搜索直接打开

五、其它

只是正如前面所说的这是消息事件系统中必备,消息事件系统又一框架中核心的必备系统之一。

不日将发出我的一个完整的消息事件系统。

测试代码只为展示组件功能,也完美的展示组件功能。

在我的"消息事件系统"中,将展示它与系统的完全结合,尽请期待...

相关推荐
hez20103 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉8 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫9 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫10 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m62511 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户917215619021111 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠11 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫13 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech14 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf15 天前
C#摸鱼实录——IoC与DI案例详解
c#