以Action、Func、Task作为方法参数,mark一下

以Action为参数

     public void TestAction()
{
//Action参数
ExecuteFunction(() =>
{ });
ExecuteFunction(ActionAAA("para"));
ExecuteFunction(AAA); //Action<T>参数,T可以由类的泛型参数输入
ExecuteFunction<string>((string praa) =>
{ });
//Action<T>参数,T主动输入
ExecuteFunction<string>((string praa) =>
{ }, "aaa");
ExecuteFunction<string>(AAA, "para");
} private void ExecuteFunction(Action action)
{
action?.Invoke();
} private void ExecuteFunction<T>(Action<T> action)
{
return;
}
private void ExecuteFunction<T>(Action<T> action, T s)
{
action?.Invoke(s);
}

引用的方法

     void AAA()
{
}
void AAA(string para)
{
}
Action ActionAAA(string para)
{
return () =>
{
Console.WriteLine(para);
};
}

以Func为参数

     public async void TestFunc()
{
//Func<string>
ExecuteFunction(() =>
{
return string.Empty;
});
//Func<Task>
ExecuteFunction(async () => { });
ExecuteFunction(FuncTask);
//Func<T, Tout>
ExecuteFunction<string, int>(BBB, "para");
//Func<T, Task>
ExecuteFunction<string>(FuncTask, "para");
//Func<T, Task<Tout>>
var stringResult = await ExecuteFunction<string, string>(FuncWithResult<string, string>, "para");
} private string ExecuteFunction(Func<string> func)
{
return func.Invoke();
} private void ExecuteFunction(Func<Task> func)
{
func?.Invoke();
}
private Tout ExecuteFunction<T, Tout>(Func<T, Tout> func, T para)
{
return func.Invoke(para);
} private void ExecuteFunction<T>(Func<T, Task> function, T para)
{
function?.Invoke(para);
}
private async Task<Tout> ExecuteFunction<T, Tout>(Func<T, Task<Tout>> function, T para)
{
return await function?.Invoke(para);
}
     private int BBB(string obj)
{
return ;
}
private async Task<Tout> FuncWithResult<T, Tout>(T para)
{
await Task.Delay();
return default(Tout);
} async Task FuncTask<T>(T para)
{ }
async Task FuncTask()
{ }

其中,

    ExecuteFunction(async () =>
    {
    });
输入async () =>{}后,Func<Task> func、Action action都是可以匹配的,优先使用的是Func<Task> func
 

以Task为参数

     private void TestTask()
{
ExecuteFunction(Task.Run(() =>
{ }));
ExecuteFunction(Task<string>.Run(async () =>
{
return string.Empty;
}));
} private void ExecuteFunction(Task task)
{
task.Start();
}
private void ExecuteFunction<Tout>(Task<Tout> task)
{
task.Start();
}

C# 以函数Action/Func/Task作为方法参数的更多相关文章

  1. VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    [提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...

  2. Delegate,Action,Func,匿名方法,匿名委托,事件

    一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 public void HelloWorld ...

  3. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  4. async 和 await 以及Action Func

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...

  5. 使用Unity拦截一个返回Task的方法

    目标 主要是想为服务方法注入公用的异常处理代码,从而使得业务代码简洁.本人使用Unity.Interception主键来达到这个目标.由于希望默认就执行拦截,所以使用了虚方法拦截器.要实现拦截,需要实 ...

  6. .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法

    前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...

  7. Delegate,Action,Func,Predicate的使用与区别

    C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...

  8. 委托delegate,Action,Func,Predicate

    C#委托的介绍(delegate.Action.Func.predicate) 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 ...

  9. Task.Run()方法总结

    一.从异步方法的声明说起 无返回值的类型异步方法 (1)public async Task MethodName() 带返回值类型的异步方法 (2)public async Task<TResu ...

随机推荐

  1. turtle文库 ——python

    本文将会为您介绍关于python--turtle库函数,学会这个库函数,会有很多让你意想不到的事情发生哦! 我也也会为你们,简单的编写几个代码,让你们看一下turtle函数的魅力 Turtle库是Py ...

  2. eclipse中去掉py文件中烦人的黄色弹框

    eclipse中写py文件,当鼠标点击在参数上时总是出现黄线的弹框,影响人操作,感觉特别烦,如下: 解决方案: windows--preferences--hover--pydev--hover取消选 ...

  3. 新手教程:不写JS,在MIP页中实现异步加载数据

    从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...

  4. AWVS12 介绍和安装详解 -- For Windows10

    一.AWVS介绍: Acunetix Web Vulnerability Scanner,简称:AWVS,是一个自动化的Web安全测试工具,它可以扫描Web站点和Web应用. AWVS可以快速扫描SQ ...

  5. Spark学习之数据读取与保存总结(二)

    8.Hadoop输入输出格式 除了 Spark 封装的格式之外,也可以与任何 Hadoop 支持的格式交互.Spark 支持新旧两套Hadoop 文件 API,提供了很大的灵活性. 要使用新版的 Ha ...

  6. Android根据word模板文档将表单数据生成word文档的方案整理

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 尝试的方案包括以下几种: freemarker 只能在java项目上运行,无法在Android项目上运行: 参考资料:<Fre ...

  7. .net core redis 驱动推荐,为什么不使用 StackExchange.Redis

    前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...

  8. centos7 修改ip和dns

    RHEL7.CentOS7命令添加和修改网卡IP地址和NDS   RHEL7.CentOS7默认安装之后是没有启动网络连接!(我们就不按6的方试设置IP了,用命令方试添加IP.网关和DNS) 一.设置 ...

  9. 实用抓包工具:whistle

    无论是前端开发还是客户端,实际开发过程中,抓包都经常被用到.工欲善其事必先利其器,一款好用的抓包工具也是必须的. 说到抓包,Windows系统上不少人都用过Fiddler,Mac或Linux上用Cha ...

  10. 前端ArcGIS学习之路-引言

    本系列主要关注ArcGIS Server以及ArcGIS API for Javascript,由于我本人是从前端方面向GIS方面学习,希望能够给更多需要了解GIS的程序员同学更多的参考.另外本系列会 ...