C#不会循环响应的Action设计与实现
2024-01-09 11:35:58
一、简述
特点:
- 不光是能防止直接的死循环调用;
- 还能防止间接的死循环调用;
- 还支持对不同参数判定,不同参数的调用可以不当循环调用;
消息事件系统中必备,拒绝死循环
简明、高效、实用
其它编程语言也可以参考实现
二、测试代码
测试代码只为展示组件功能,也完美的展示组件功能。测试用例是完全的
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://blog.csdn.net/AnYuanLzh/article/details/135420338
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!