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));
        }

另一种写法

      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)
            {

            }

原文地址:https://www.cnblogs.com/xuexian/p/9249904.html

时间: 2024-11-01 21:30:16

Action执行与Delegate的差异,调用方法的相关文章

Struts2中Action的动态调用方法

在Struts2中,Action执行的时候并不一定要执行execute,我们可以指定Action执行哪个方法,下面分别介绍三种方法来指定Action执行哪个方法: 1.第一种方法,通过Action里的method属性指定执行方法,我们可以在struts.xml配置文件中配置Action的时候用method="   " 来指定执行的哪个方法. (1).接下来附上一个例子,通过第一种方法来指定执行方法,首先,复制一个已经搭建好struts2环境的web项目,这里我们复制ActionTest

Action的动态调用方法

Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法: 1. 方法一(通过methed属性指定执行方法): 可以在配置文件中配置Action的时候用method=来指定执行哪个方法 <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add"> <result>/user_ad

Struts2 Action下面的Method调用方法

1. 在struts.xml中加入<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 来打开struts中的DMI功能,调用方法为userAction!add 解决使用Struts2.3.16 出现There is no Action mapped for namespace [/user] and action name [user!add] associated

IOS 执行动画后想要调用某个方法

第一种方法:,使用监听 UIView beginAnimations 方法如下: [UIView beginAnimations:nil context:nil]; //代理,监听对象 [UIView setAnimationDelegate:self]; //<span style="font-family: Arial, Helvetica, sans-serif;">removeCover 是动画执行完后要调用方法</span> [UIView setAn

Action实现prepareable接口后定义前置方法

// 访问每一个action的方法都会先调用此方法:前置方法 @Override public void prepare() throws Exception { System.out.println("prepare"); } // input,save方法之前执行 public void prepareInput() throws Exception { System.out.println("prepareInput:" + id); if (id != nu

一定间隔时间下重复执行一个函数的几个方法

如果有个操作,我们需要过一会儿再做,或者每隔一段时间就要做一次.可以有很多种做法. 独立线程 是的,对.NET Framework本身一知半解的程序员才会使用这种方案.不过,现实中这个方案其实并不少见. public static void Repeat(this Action action, TimeSpan interval) { new Thread(new ThreadStart(() => { while(true) { Thread.Sleep(interval); action()

设置调用方法的超时时间

在工作中,遇到这样一个需求,我要做一个业务,要验证一下现有的数据是否正确,但这个验证又不是必须的,只是说如果这里验证不通过,后面流程就可以不走了,但是如果这里没有验证到,后面也会有验证.也就是说不影响主流程,算得上是一个优化吧.比如我要查询一个东西,但是这个时间不能超过1秒. 在网上查了一下,基本上都是异步执行,有两个线程来做.我查到有两种方法. 第一种 独立成一个类 代码如下: (1).FuncTimeOut类 /// <summary> /// 超时设置类 /// </summary

Struts2 动态调用方法

struts2动态调用方法有两种方式 方式一:用通配符进行调用: Action方法: 1 package com.bjyinfu.struts.actions; 2 3 public class CatchDynamicMethod { 4 5 public String doFirst(){ 6 System.out.println("执行doFirst方法"); 7 return "success"; 8 } 9 10 public String doSecon

原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以遵循本文采用的各种方案. 本文内容 反射各方法的性能数据 反射的高性能开发建议 创建类型的实例 反射获取 Attribute 反射调用公共 / 私有方法 使用预编译框架 附本文性能测试所用的代码 所有反射相关方法 IsDefined 和 GetCustomAttribute 的专项比较 参考资料 反