首页 新闻 会员 周边 捐助

关于委托的BeginInvoke的一个问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-10-16 11:16

众所周知 BeginInvoke既不属于Delegate类也不属于MulticastDelegate类 他是定义了一个具体的委托类型后再编译所生成的 现在我想写一个公共的方法 传入一个Delegate类型和一些参数 然后调用这个类型的BeginInvoke  具体如下:

 public static object[] FireEvent(Delegate del, params object[] args)
        {
            List<object> list = new List<object>();
            if (del != null)
            {
                Delegate[] del_list = del.GetInvocationList();

               
                foreach (var item in del_list)
                {
                    try
                    {
                        (item as 具体委托类型).BeginInvoke(null, null);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }


            }
            return list.ToArray();
        }

可是我这个 “具体委托类型” 是不确定的 应该怎么办呢? 诚恳邀请各位大牛解答 !先谢谢了!

果果天涯的主页 果果天涯 | 初学一级 | 园豆:16
提问于:2012-10-10 11:52
< >
分享
最佳答案
0

同步的话 直接DynamicInvoke

                foreach (var item in del_list)
                {
                    try
                    {

                        item.DynamicInvoke(args);
                        //item.DynamicInvoke();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }

异步的话,就要用具体的委托了,声明一个具体委托,再把你的委托传入,再调用DynamicInvoke

        public static object[] FireEvent(Delegate del, params object[] args)
        {
            List<object> list = new List<object>();

            //具体委托
            Func<Delegate, object[], object> executeHandler = (dl, arg) =>
                                                              {
                                                                  return dl.DynamicInvoke(args);
                                                              };

            if (del != null)
            {
                Delegate[] del_list = del.GetInvocationList();

                foreach (var item in del_list)
                {
                    try
                    {
                        executeHandler.BeginInvoke(item, args, null, null);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }

            }
            return list.ToArray();
        }
收获园豆:10
Qlin | 老鸟四级 |园豆:2403 | 2012-10-10 13:09

目前来说 我还没看懂这段代码 不过我想你应该是对的 谢谢啦!

果果天涯 | 园豆:16 (初学一级) | 2012-10-16 11:16
其他回答(1)
0

可以用反射,试试看。

item.Method.Invoke(item.Target, null);
Ethan轻叹 | 园豆:996 (小虾三级) | 2012-10-10 13:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册