zoukankan      html  css  js  c++  java
  • Action执行与Delegate的差异,调用方法

    MSDN:可以使用 Action<T> 委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。 (在 C# 中,该方法必须返回 void。 在 Visual Basic 中,必须通过 Sub…End Sub 结构来定义它。 它也可以是返回已忽略的值的方法。)通常,这种方法用于执行某个操作。

    Action是一个泛型的委托,其内部即使用delegate去实现,当普通的delegate定义的参数与Action个数、类型一致时,两者实现的功能是一样的。只是Action的方式更加简洁、规范。如下:

    public delegate void DoDelegate(object parm);
            public DoDelegate DoMethod;
    
            public Action<object> doAction4OneParm;
            public Action<object, object> doAction4TwoParm;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DoMethod += DoTestMetohd;  //普通委托(由于委托定义时给定一个参数,故此处匹配一个参数的方法)
                doAction4OneParm += DoTestMetohd;  //Action委托(此处匹配一个参数的方法)
                doAction4TwoParm += DoTestMetohd;  //Action委托(此处匹配两个参数的方法)
            }
    
            private void DoTestMetohd(object parm)
            {
                MessageBox.Show(Convert.ToString(parm));
            }
    
            private void DoTestMetohd(object parm1, object parm2)
            {
                MessageBox.Show(Convert.ToString(parm1 + " " + parm2));
            }
    View Code

    另一种写法

          try
                {
                    if (File.Exists(path))
                    {
                        byte[] by = File.ReadAllBytes(path);
                        by = by.GzipDecompression();
                        Dictionary<string, Model> list = JsonHelper.DeserializeObject<Dictionary<string, Model>>(Encoding.UTF8.GetString(by));
    
                        Action<object> ac = (p) =>
                        {
                            KeyValuePair<string, Model> v = (KeyValuePair<string, Model>)p;
    
                            if (bool)
                            {
                                //DoSomething
                            }
                            else
                            {
                                //DoSomething
                                
                            }
                        };
                        List<Task> tasks = new List<Task>();
                        foreach (KeyValuePair<string, CacheDataModel> v in list)
                        {
                            tasks.Add(Task.Factory.StartNew(ac, v));
    
                        }
                        Task.WaitAll(tasks.ToArray());
                        for (int i = 0; i < tasks.Count; i++)
                        {
                            tasks[i].Dispose();
                        }
                        tasks = null;
    
                    }
                    else
                    {
                        
                    }
                }
                catch (Exception e)
                {
                    
                }
  • 相关阅读:
    jQuery之防止冒泡事件
    jQuery复制节点
    jQuery查找节点
    jQuery表单选择器
    jQuery之事件触发trigger
    jQuery样式操作
    为FLASH正名!HTML5前景分析
    iframe 高度自动调节,最简单解决
    Iframe和母版页(.net)
    表单遮住弹出层解决方法(select遮住DIV)
  • 原文地址:https://www.cnblogs.com/xuexian/p/9249904.html
Copyright © 2011-2022 走看看