• 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)
                {
                    
                }
  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/xuexian/p/9249904.html
Copyright © 2020-2023  润新知