/// <summary>
    /// 消息广播类
    /// 此类是线程安全的
    /// </summary>
    public class Messenger
    {
        private Dictionary<string, MessengerEvents> _events;

        private static object _lockobj = new object();
        private static Messenger _messenger;
        public static Messenger Instance
        {
            get
            {
                lock (_lockobj)
                {
                    if (_messenger == null)
                    {
                        lock (_lockobj)
                            _messenger = new Messenger();
                    }
                }
                return _messenger;
            }
        }
        private Messenger()
        {
            _events = new Dictionary<string, MessengerEvents>();
        }
        /// <summary>
        /// 注册广播接收事件
        /// </summary>
        /// <param name="sign">广播标识</param>
        /// <returns></returns>
        public MessengerEvents Register(string sign)
        {
            MessengerEvents me;
            lock (_lockobj)
            {
                if (_events.ContainsKey(sign))
                    me = _events[sign];
                else
                {
                    me = new MessengerEvents();
                    _events.Add(sign, me);
                }
            }

            return me;

        }
        /// <summary>
        /// 发送广播
        /// </summary>
        /// <param name="sign">广播标识</param>
        public void Send(string sign)
        {
            lock (_lockobj)
            {
                if (_events.ContainsKey(sign))
                {
                    _events[sign].ExeFun();
                }
            }

        }
        /// <summary>
        /// 发送广播
        /// </summary>
        /// <param name="sign">广播标识</param>
        /// <param name="args">广播参数</param>
        public void Send(string sign, params dynamic[] args)
        {
            lock (_lockobj)
            {
                if (_events.ContainsKey(sign))
                {
                    _events[sign].ExeFun(args);
                }
            }

        }
        /// <summary>
        /// 发送广播
        /// </summary>
        /// <param name="sign">广播标识</param>
        /// <returns>返回结果</returns>
        public OperationResult SendByResult(string sign)
        {
            lock (_lockobj)
            {
                if (_events.ContainsKey(sign))
                {
                    return _events[sign].ExeFunResult();
                }
            }
            return null;
        }
        /// <summary>
        /// 发送广播
        /// </summary>
        /// <param name="sign">广播标识</param>
        /// <param name="args">广播参数</param>
        /// <returns>返回结果</returns>
        public OperationResult SendByResult(string sign, params dynamic[] args)
        {
            lock (_lockobj)
            {
                if (_events.ContainsKey(sign))
                {
                    return _events[sign].ExeFunResult(args);
                }
            }
            return null;
        }
    }

 

 #region 广播委托
    /// <summary>
    /// 没有参数的广播方法实现
    /// </summary>
    public delegate void Broadcast();
    /// <summary>
    /// 含有参数的广播方法实现
    /// </summary>
    /// <param name="args">参数</param>
    public delegate void BroadcastParams(dynamic[] args);
    public delegate OperationResult BroadcastResult();
    public delegate OperationResult BroadcastParamsResult(dynamic[] args);
    #endregion

    /// <summary>
    /// 广播事件定义类
    /// </summary>
    public class MessengerEvents
    {
        /// <summary>
        /// 无参数无返回值的广播接收事件
        /// </summary>
        public event Broadcast Receive;
        /// <summary>
        /// 含有参数无返回值的广播接收事件
        /// </summary>
        public event BroadcastParams ReceiveByParams;
        /// <summary>
        /// 无参数具有返回值的广播接收事件
        /// </summary>
        public event BroadcastResult ReceiveResult;
        /// <summary>
        /// 含有参数具有返回值的广播接收事件
        /// </summary>
        public event BroadcastParamsResult ReceiveResultByParams;

        #region 方法
        internal void ExeFun()
        {
            if (Receive != null)
                Receive();
        }
        internal void ExeFun(params dynamic[] args)
        {
            if (ReceiveByParams != null)
                ReceiveByParams(args);
        }

        internal OperationResult ExeFunResult()
        {
            if (Receive != null)
                return ReceiveResult();

            return null;
        }
        internal OperationResult ExeFunResult(params dynamic[] args)
        {
            if (ReceiveByParams != null)
                return ReceiveResultByParams(args);

            return null;
        }
        #endregion
    }

posted on 2017-04-21 09:37  张小帅  阅读(248)  评论(0编辑  收藏  举报