c# 事件路由器

事件转发

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RouteSystem
{
    #region action define
    public interface IGAction
    {
        void Execute();
        void Execute<T1>(T1 arg1);
        void Execute<T1, T2>(T1 arg1, T2 arg2);
        void Execute<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
        void Execute<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
        void Execute<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
        void Execute<T1, T2, T3, T4, T5, T6>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
        void Execute<T1, T2, T3, T4, T5, T6, T7>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
    }

    public class GAction : IGAction
    {
        Action action = null;
        public GAction(Action action_) { action = action_; }

        public void Execute()
        { action(); }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5,U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1> : IGAction
    {
        Action<T1> action = null;
        public GAction(Action<T1> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1)
        { action((T1)(object)(arg1)); }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1, T2> : IGAction
    {
        Action<T1, T2> action = null;
        public GAction(Action<T1, T2> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2)
        { action((T1)(object)(arg1), (T2)(object)arg2); }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1, T2, T3> : IGAction
    {
        Action<T1, T2, T3> action = null;
        public GAction(Action<T1, T2, T3> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3)
        { action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3); }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1, T2, T3, T4> : IGAction
    {
        Action<T1, T2, T3, T4> action = null;
        public GAction(Action<T1, T2, T3, T4> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4)
        { action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4); }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1, T2, T3, T4, T5> : IGAction
    {
        Action<T1, T2, T3, T4, T5> action = null;
        public GAction(Action<T1, T2, T3, T4, T5> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5)
        { action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4, (T5)(object)arg5); }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1, T2, T3, T4, T5, T6> : IGAction
    {
        Action<T1, T2, T3, T4, T5, T6> action = null;
        public GAction(Action<T1, T2, T3, T4, T5, T6> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6)
        { action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4, (T5)(object)arg5, (T6)(object)arg6); }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7) { }
    }

    public class GAction<T1, T2, T3, T4, T5, T6, T7> : IGAction
    {
        Action<T1, T2, T3, T4, T5, T6, T7> action = null;
        public GAction(Action<T1, T2, T3, T4, T5, T6, T7> action_) { action = action_; }

        public void Execute() { }
        public void Execute<U1>(U1 arg1) { }
        public void Execute<U1, U2>(U1 arg1, U2 arg2) { }
        public void Execute<U1, U2, U3>(U1 arg1, U2 arg2, U3 arg3) { }
        public void Execute<U1, U2, U3, U4>(U1 arg1, U2 arg2, U3 arg3, U4 arg4) { }
        public void Execute<U1, U2, U3, U4, U5>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5) { }
        public void Execute<U1, U2, U3, U4, U5, U6>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6) { }
        public void Execute<U1, U2, U3, U4, U5, U6, U7>(U1 arg1, U2 arg2, U3 arg3, U4 arg4, U5 arg5, U6 arg6, U7 arg7)
        { action((T1)(object)(arg1), (T2)(object)arg2, (T3)(object)arg3, (T4)(object)arg4, (T5)(object)arg5, (T6)(object)arg6, (T7)(object)arg7); }
    }
    #endregion

    public class EventListener
    {
        List<IGAction> reactions = null;
        EventRouter router = null;

        public EventListener(EventRouter er) { router = er; }
        public void DetachEvents()
        {
            if (reactions == null || router == null)
                return;

            foreach(IGAction reaction in reactions)
            { router.RemoveReaction(reaction); }
        }

        #region //listen event
        protected void ListenEvent(string sevent, Action cb) {
            IGAction igaction = new GAction(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1>(string sevent, Action<T1> cb) {
            IGAction igaction = new GAction<T1>(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1, T2>(string sevent, Action<T1, T2> cb) {
            IGAction igaction = new GAction<T1, T2>(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1, T2, T3>(string sevent, Action<T1, T2, T3> cb) {
            IGAction igaction = new GAction<T1, T2, T3>(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1, T2, T3, T4>(string sevent, Action<T1, T2, T3, T4> cb) {
            IGAction igaction = new GAction<T1, T2, T3, T4>(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1, T2, T3, T4, T5>(string sevent, Action<T1, T2, T3, T4, T5> cb) {
            IGAction igaction = new GAction<T1, T2, T3, T4, T5>(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1, T2, T3, T4, T5, T6>(string sevent, Action<T1, T2, T3, T4, T5, T6> cb) {
            IGAction igaction = new GAction<T1, T2, T3, T4, T5, T6>(cb);
            AddReaction(sevent, igaction);
        }
        protected void ListenEvent<T1, T2, T3, T4, T5, T6, T7>(string sevent, Action<T1, T2, T3, T4, T5, T6, T7> cb) {
            IGAction igaction = new GAction<T1, T2, T3, T4, T5, T6, T7>(cb);
            AddReaction(sevent, igaction);
        }
        #endregion

        private void AddReaction(string sevent, IGAction reaction_)
        {
            if (router == null) return;
            router.AddReaction(sevent, reaction_);
            if (reactions == null) reactions = new List<IGAction>();
            reactions.Add(reaction_);
        }
    }

    public class EventRouter
    {
        Dictionary<string, List<IGAction>> containers = new Dictionary<string, List<IGAction>>();

        public void AddReaction(string sevent, IGAction reaction)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null)
            {
                reactionlist = new List<IGAction>();
                containers.Add(sevent, reactionlist);
            }
            IGAction old = reactionlist.Find(x => x == reaction);
            if(old == null) reactionlist.Add(reaction);
        }

        public void RemoveReaction(IGAction reaction)
        {
            foreach(KeyValuePair<string, List<IGAction>> kv in containers)
            {
                IGAction old = kv.Value.Find(x => x == reaction);
                if (old != null)
                {
                    kv.Value.Remove(old);
                    break;
                }
            }
        }

        public List<IGAction> GetReactionList(string sevent)
        {
            List<IGAction> reactionlist = null;
            containers.TryGetValue(sevent, out reactionlist);
            return reactionlist;
        }

        #region // send event
        public void SendEvent(string sevent)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute();
            }
        }
        public void SendEvent<T1>(string sevent, T1 arg1)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1);
            }
        }
        public void SendEvent<T1, T2>(string sevent, T1 arg1, T2 arg2)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1, arg2);
            }
        }
        public void SendEvent<T1, T2, T3>(string sevent, T1 arg1, T2 arg2, T3 arg3)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1, arg2, arg3);
            }
        }
        public void SendEvent<T1, T2, T3, T4>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1, arg2, arg3, arg4);
            }
        }
        public void SendEvent<T1, T2, T3, T4, T5>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1, arg2, arg3, arg4, arg5);
            }
        }
        public void SendEvent<T1, T2, T3, T4, T5, T6>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1, arg2, arg3, arg4, arg5, arg6);
            }
        }
        public void SendEvent<T1, T2, T3, T4, T5, T6, T7>(string sevent, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
        {
            List<IGAction> reactionlist = GetReactionList(sevent);
            if (reactionlist == null) return;
            foreach (IGAction el in reactionlist)
            {
                el.Execute(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
            }
        }

        #endregion
    }
}

使用

public class MyUI : RouteSystem.EventListener
    {
        void nothing() { /*Console.WriteLine("nothing");*/ }
        void sayhi(string h) { /*Console.WriteLine("sayhi");*/ }
        void run(int a) { /*Console.WriteLine("run");*/ }
        void jump(int a, int r) { /*Console.WriteLine("jump");*/ }
        void mix(int a, int b, char s, float c, float d) { /*Console.WriteLine("mix");*/ }

        public MyUI(RouteSystem.EventRouter er):base(er)
        {
            ListenEvent("nothing", nothing);
            ListenEvent<string>("sayhi", sayhi);
            ListenEvent<int>("run", run);
            ListenEvent<int, int>("jump", jump);
            ListenEvent<int, int, char, float, float>("mix", mix);
        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            RouteSystem.EventRouter er = new RouteSystem.EventRouter();
            for (int i = 0; i < 100; i++)
            {
                MyUI el = new MyUI(er);
            }

            long x = System.DateTime.Now.Ticks;
            for (int i = 0; i < 1000000; i++)
            {
                int a = 1;
                int b = 2;
                char c = ‘a‘;
                float d = 0f;
                float e = 1f;
                er.SendEvent("run", a);
            }
            x = System.DateTime.Now.Ticks - x;
            Console.WriteLine("cost " + x.ToString());
        }

    }
时间: 2024-08-02 17:18:02

c# 事件路由器的相关文章

2017年开年的第一次比较大的安全事件: MongoDB “赎金事件”,如何看待互联网安全问题

今天上午(2017年1月7日),我的微信群中同时出现了两个MongoDB被黑掉要赎金的情况,于是在调查过程中,发现了这个事件.这个事件应该是2017年开年的第一次比较大的安全事件吧,发现国内居然没有什么报道,国内安全圈也没有什么动静(当然,他们也许知道,只是不想说吧),Anyway,让我这个非安全领域的人来帮补补位. 事件回顾 这个事情应该是从2017年1月3日进入公众视野的,是由安全圈的大拿 Victor Gevers (网名:0xDUDE,GDI.foundation 的Chairman),

从谷歌宕机事件认识互联网工作原理

原文转自:http://kb.cnblogs.com/page/166210/ 英文原文:Why Google Went Offline Today and a Bit about How the Internet Works 译者注:本文中提到 CloudFlare 是一家总部位于美国旧金山的内容分发网络(CDN)服务公司,由 Project Honey Pot 项目的三位前开发人员成立于 2009 年.2011 年 10 月被华尔街日报评为最具创新精神的网络科技公司. 今天,谷歌的服务经历了

利用PRTG实现对cisco路由器的cpu负载、端口流量等的监控

一.实验目的及前期准备 用gns3.vmware模拟真实的环境,利用prtg实现对cisco路由器状态的监控 前期准备:GNS3仿真路由软件和VMware虚拟软件,PRTG. 二.实验步骤 1)搭建如下拓扑环境 VMware server有2张网卡,一张(out)桥接到真实主机(Windows7)的网卡,另一张(in)连接到GNS3的R1路由器的e1/0上:R1路由器的e1/1和VMwar winxp的网卡相连. a)VMware安装一个server2003系统和一个xp系统,并虚拟3张虚拟网卡

openwrt-智能路由器hack技术(1)---&quot;DNS劫持&quot;

openwrt-智能路由器hack技术(1)---"DNS劫持" 1   导读 PS:之前写的一个文章,现在发现结构内容排版不是太好,导致阅读体验太差,影响传播和SEO,所以现在整理拆分一下,从小处写起, 本系列介绍了两个关于智能路由器的hack技术,供大家赏玩一下. 本文提到的两个基于网络的hack技术: DNS劫持 数据抓包 基本本质上就是路由器设备的两个主要网络功能: 网关配置功能 网关数据中转功能 但是用于软件开发的正途,就变换成下面的说法: 网络环境迁移 数据监控 由于大家可

自己动手写客户端UI库——事件机制(设计思路大放送)

在上一篇文章中我们创建了一个Button控件,并把这个控件显示在界面上, 在这一篇文章中,我们将为这个控件增加一个事件和一个方法 一:怎么绑定事件的问题 在Winform中,我们对一个按钮绑定事件的方式如下(这是真正的事件) 然而,在WUI库中,为一个按钮绑定事件是这样的,(这不是一个事件,这只是调用了一个方法,给这个方法传递了一个i额委托) 问题: 为什么会有这样的差异呢?实在是无奈之举(也希望园友多提意见) 回答: 我们在给一个WUI按钮绑定事件的时候,这个按钮有可能已经呈现在界面上了:也有

读取cc2530节点的设备类型、协调器、路由器、终端。

建立网络.加入网络流程分析 协调器节点:在1-10  实验8 网络通信实验2 组播通信中 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO_STATE_CHANGE:  //建立网络后,设置事件 GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//??????? if(GenericApp_NwkState==DEV_ZB_COORD)//把该节点已初始化为协调器,则执行下面的

zstack中事件加入到任务的方式

关于任务的初始化和处理 函数,前面的文章已经讲述的很清楚了,这里就不再啰嗦了. 在zstack的协议栈中一个任务下最多可以15个事件(除去系统的强制事件),那么这些事件是如何添加到任务中的呢?在这里我仅仅探讨一些用户自己的任务下的事件是如何添加的,至于APS层和网络层,这里暂不做过多的讲解. 先给出实现的两种方式,我仅仅知道两种方式,至于其他的方式暂且不知道,欢迎大家进行补充和指教. 1. osal_set_event();使用这个函数,至于如何调用,大家看看介绍就知道了.这个函数在用户的任务初

根据排队论阐述路由器和高速公路的拥堵以及拥堵缓解问题

关于本文 相信很多人都在节假日的高速公路上遇到过大拥堵,但是最终拥堵会解除.也有人在质疑路由器队列的长度,以为最终路由器会拒绝服务.我曾经在10年前天真地以为高速公路的设计者和路由器交换机的设计者工作是多么的轻松.然而现在,当我知道更多后,发现事实并不如此.需要更多的权衡和博弈,不仅仅是技术方面的,还涉及到了心理学,社会学,经济学.       因此本文旨在用最简单的描述分析一下排队理论对高速公路以及分组交换网络的指导.文中没有复杂的数学推导,这种推导请自行完成,或者请背诵大学概率论教科书的相关

华为路由器交换机配置命令大全

华为路由器交换机配置命令:计算机命令 PCAlogin:root;使用root用户 password:linux;口令是linux #shutdown-hnow;关机 #init0;关机 #logout;用户注销 #login;用户登录 #ifconfig;显示IP地址 #ifconfigeth0netmask;设置IP地址 #ifconfigeht0netmaskdown;禁用IP地址 #routeadd0.0.0.0gw;设置网关 #routedel0.0.0.0gw;删除网关 #route