使用篇三,消息模块

本文介绍了消息模块的使用,包括发送消息、解耦合以及消息优先级控制。首先声明了IPub接口和Pub类,然后创建Listenner监听IPub和MessageExample类型的消息。设置消息模块每帧处理一次,发布Pub类型消息,并在检测到按键时发送消息。重点讨论了消息模块如何匹配子类型以及如何通过优先级调整消息执行顺序。最后提到了消息队列的概念,为后续深入探讨埋下伏笔。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模块的开始

从这里开始,我们要开始注入模块了
今天、我们先来注入一个消息模块
消息模块是干啥的?
	1、发送消息
	2、解耦
	3、貌似没了

话不多说,上码


    public class MessageExample : Test
    {
        public interface IPub { }
        public class Pub : IPub { }
        public class Listenner : IMessageListener
        {
            public Listenner()
            {
                Framework.env0.modules.Message.Subscribe<IPub>(Listen);
                Framework.env0.modules.Message.Subscribe<MessageExample>(this);
            }
            public void Listen(IMessage message)
            {
                Log.L(string.Format("Recieve code {0} by type {1}", message.code, message.subject));
            }
        }


        protected override void Start()
        {
            Listenner listenner = new Listenner();
            Log.L("不要太频繁按键,因为 1秒 检测一次按键");
            //Framework.env0.modules.Message.fitSubType = false;
            Framework.env0.modules.Message.processesPerFrame = 1;
            IMessage message = null;
            message = Framework.env0.modules.Message.Publish<Pub>(null)
                .SetCode(100)
                .OnRecycle((msg)=> {
                    Log.L($"equals  {message == msg}");
                    Log.L($"state  {msg.state}   err   {msg.errorCode}");

                    Log.L("\n\n");
                    Log.L("开始按键");
                });
            Log.L(string.Format("the position is {0} priority is {1}", message.position, message.priority)); 
        }

        protected override void Update()
        {
            var key = Console.ReadKey();
            Log.L($"检测到按键  {key.Key} 并且发送消息 ,  按键序号为    {(int)key.Key}");
            Log.L($"剩余消息条数  {Framework.env0.modules.Message.count}");
            for (int i = 0; i < 2; i++)
            {
                Framework.env0.modules.Message.PublishByNumber(this, null, (int)key.Key - i)
                    .SetCode((int)key.Key - i)
                    .OnRecycle((msg) => {
                        Log.L($"state  {msg.state}   err   {msg.errorCode}");
                    });
            }
        }

        protected override void Stop()
        {
        }
    }

解析

	0、这次的🐎有点长
	1、声明  IPub 接口
	2、声明 Pub 类 继承自 IPub 接口
	3、声明一个 Listenner,去监听 IPub 类型 与 MessageExample 类型
	4、对消息模块做一些设置    一帧只处理一次
	5、发布 Pub 类型消息一个
	6、 在帧函数 内检测到按键,就发消息
	
让我们来看看输出

在这里插入图片描述

      我们可以发现 先收到了 Pub  类型的消息
      Why?为什么会收到? 我们明明只是注册了 IPub   类型,悲伤那么大
      		阐述: Pub  类型继承自 IPub   
      			消息模块默认会去匹配子类型    Pub  是 IPub  子类型
      		如果不需要此功能?
      		    消息模块 有一个属性  fitSubType  置为 false 即可
    
     下面就是 检测到按键,然后发出的消息
     因为我们设置了一帧只执行一个,
     所以我们可以看到两个执行时间不一样
     
    你可能会问,这写消息都滞后了,我想立刻执行怎么办?
    考虑到了
      		在消息模块的发布方法中,有一个参数叫做优先级
      		通过优先级可以控制消息的先后,优先级很多 ,如下图

在这里插入图片描述
在这里插入图片描述

结束

这个消息模块主要功能就只有注册和发布
另外的功能呢是根据消息队列的理念造的
消息队列是什么?卧槽!!!!
hey hey hey
请听 后续 分解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值