C#的单例模式 以及 消息分发机制实现

C#单例模式,多线程安全

//Singleton.cs public class Singleton<T> where T : new() {     private static T _instance;     private static object _lock = new object();     protected Singleton() {}     public static T Instance()     {         if(_instance == null)         {             lock(_lock)             {                 if(_instance == null)                 {                     _instance = new T();                 }             }         }         return _instance;     } }

C#消息分发机制,用了delegate

//MessageDispatcher.cs using System.Collections; using System.Collections.Generic; public class MyMessageDispatcher : Singleton<MyMessageDispatcher> {     Dictionary<uint, MessageHandler> m_HandlerMap;          public MyMessageDispatcher()     {         m_HandlerMap = new Dictionary<uint, MessageHandler> ();     }          public void RegisterMessageHandler(uint iMessageType, MessageHandler handler)     {         if (handler == null)             return;                           if (!m_HandlerMap.ContainsKey (iMessageType))          {             MessageHandler Handlers = handler;             m_HandlerMap.Add (iMessageType, Handlers);         }          else          {             m_HandlerMap[iMessageType] += handler;         }     }          public void UnRegisterMessageHandler(uint iMessageType,  MessageHandler handler)     {         if (handler == null)             return;                  if(m_HandlerMap.ContainsKey (iMessageType))         {             m_HandlerMap[iMessageType] -= handler;         }     }          public void SendMessage(uint iMessageType, object arg)     {         if(m_HandlerMap.ContainsKey (iMessageType))         {             if(m_HandlerMap[iMessageType] != null)             {                 m_HandlerMap[iMessageType].Invoke(iMessageType, arg);             }         }     } } //EMessageType.cs中定义事件类型 public enum EUIMessage : uint {     UITest0 = 0,     UITest1 = 1,     UITest2 = 2 }

使用消息分发机制示例:

//发出消息事件 MessageDispatcher.Instance().SendMessage((uint)EUIMessage.UITest0, “ouput”); //接受消息端,先要注册侦听消息,此处的例子是在Unity3D中实现的 public class TestText : MonoBehaviour  {     void OnEnable()     {         MyMessageDispatcher.Instance ().RegisterMessageHandler ((uint)EUIMessage.UITest0, ChangePlay0);     }     void OnDisable()     {         MyMessageDispatcher.Instance ().UnRegisterMessageHandler ((uint)EUIMessage.UITest0, ChangePlay0);     }     public void ChangePlay0(uint iMessageType, object kParam)     {         string txt = (string) kParam;         GUIText text = GetComponent<GUIText>();         text.text = txt ;     } }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Mybatis Plus代码方式实现多表关联查询

 Mapper接口如下:例1@Select("SELECTt\_question.\,t\_student.\name\FROMt\_question,t\_studentWHEREt\_question.student\_idt\_student.id")List<QuestionStudentVOgetQ