C#实现全局通信。

26 篇文章 7 订阅
3 篇文章 0 订阅

有时候在开发过程中,框架提供的通信机制可能无法满足我们的要求,这时候我们自己可以定义一个全局的事件注册器,类似于观察者模式,下面直接上代码。

  public static class EventDispatcher
    {
        private static Dictionary<string, Action<object>> _actions;
        static EventDispatcher()
        {
            _actions = new Dictionary<string, Action<object>>();
        }

        //添加一个事件
        public static void AddAction(string key, Action<object> action)
        {
            if (!_actions.ContainsKey(key))
            {
                _actions.Add(key, action);
            }
            else
            {
                throw new Exception($"event key{key} has existed");
            }
        }



        //移除
        public static void RemoveAction(string key)
        {
            if (_actions.ContainsKey(key))
            {
                _actions.Remove(key);
            }
        }
        //判断是否存在
        public static bool IsExist(string key)
        {
            return _actions.Keys.Contains(key);
        }

         //激活
        public static async Task Dispatch(string key, object value)
        {
            await Task.Run(()=> {
                Console.WriteLine("Dispatch");
                Console.WriteLine(string.Join(",", _actions.Keys));
                if (_actions.ContainsKey(key))
                {
                    var act = _actions[key];
                    act.Invoke(value);
                }
            });
           

        }
    }

简单解释一下,定义一个全局静态类EventDispatcher,方便其他类调用,当我们需要做某些操作的时候,我们调用AddAction方法,将需要操作的方法添加进去,在合适的时候再调用Dispatch方法,进行唤起,这里注意一点,就是每次注册方法的时候,调用一下IsExist,看是否存在,防止发生意外。

简单演示一下:

我们先进行事件注册:

   private async Task OnCreateIceBoxClick()
    {

        
        //注册一个添加冰箱完成后刷新树节点的事件
        if (!EventDispatcher.IsExist("IceBoxNodeRefsh"))
        {
            EventDispatcher.AddAction("IceBoxNodeRefsh", IceBoxNodeRefsh);
        }
   

        await Task.CompletedTask;

    }

    //刷新树的冰箱节点
    private async void IceBoxNodeRefsh(object Argument)
    {
        await InvokeAsync(
           async () => {
                await OnInitializedAsync();
                await OnExpandNode(_Roomite);
            }
            );
    }

然后再需要的地方调用:

    //如果是再树节点执行的添加操作 就进行刷新
            if (EventDispatcher.IsExist("IceBoxNodeRefsh"))
            {
               await  EventDispatcher.Dispatch("IceBoxNodeRefsh","");
            }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值