1.相同点

Func<ReqMode,ResultModel> 与 Action<ReqMode>

1).都是Net3.5 之后内置的委托方法,作用几乎一致

2).都支持lambad 表达式方式调用

2.不同:

Func<ReqMode,ResultModel> 有返回值

Action<ReqMode>  无返回值

3. BeginInvoke与EndInvoke

1). BeginInvoke方法触发你的异步方法,它和你想要执行的异步方法有相同的参数。另外还有两个可选参数,第一个是AsyncCallback委托是异步完成的回调方法。第二个是用户自定义对象,该对 象将传递到回调方法中。BeginInvoke立即返回并且不等待完成异步的调用(继续执行该下面的代码,不需要等待)。BeginInvoke返回IAsyncResult接口,可用于检测异步调用的过程。

2). 通过EndInvoke方法检测异步调用的结果。如果异步调用尚未完成,EndInvoke将阻塞调用线程,直到它完成。EndInvoke参数包括out和ref参数。

3).BeginInvoke和EndInvoke进行异步调用的四种常见方式。在调用BeginInvoke可以做以下工作:

  1. 做一些其他操作,然后调用EndInvoke方法阻塞线程直到该方法完成。
  2. 使用IAsyncResult.AsyncWaitHandle属性,使用它的WaitOne方法阻塞线程直到收到WaitHandle信号,然后调用EndInvoke。
  3. 检查BeginInvoke返回值IAsyncResult的状态来决定方法是否完成,然后调用EndInvoke方法。
  4. 通过在BeginInvoke方法中传递该委托,在回调方法中调用该委托的EenInvoke方法。

注意

无论你怎么使用,都必须调用EndInvoke方法结束你的异步调用。

示例:

Action<T>:

 1     /// <summary>
2 /// 异步委托的方式实现合并方法调用
3 /// </summary>
4 /// <param name="files"></param>
5 private void MergeEMSANDJZLXHPDFAsync(List<MergeFiles> files)
6 {
7 Action<List<MergeFiles>> CustomActionAsync =CustomAction;
8 AsyncCallback callback = (result) =>
9 {
10 AsyncResult ar = (AsyncResult)result;
11 Action<String> a = (Action<String>)ar.AsyncDelegate;
12 a.EndInvoke(result);
13 showSumMsg($"------线程号{Thread.CurrentThread.ManagedThreadId}的任务完成,操作文件数:{files.Count},当前总数为:{EditFileNum}个!------");
14 };
15 CustomActionAsync.BeginInvoke(files, callback, CustomActionAsync);
16 }
17
18 /// <summary>
19 /// 自定义方法
20 /// </summary>
21 /// <param name="files"></param>
22 private void CustomAction(string Name)
23 {
24 // 自定义逻辑
25 }

  

Func<T,TResult>

1 Func<BillGenRecordReqModel,JsonDataModel> PushSaveBillGenRecord = (req) =>{
var res= PushSaveBillGenRecord_Post(req);
2 return res;
3 };
4 AsyncCallback PushSaveBillGenRecordFun = (result) => {
5 var res = ((Func<BillGenRecordReqModel, JsonDataModel>)result.AsyncState).EndInvoke(result);//自定义的方法
6 //日志
7 Core.BizTool.LogPlat.LogHelper.Info("PushSaveBillGenRecord", "PushSaveBillGenRecordFun", "", $"{reqModel.WorkNo}", $"异步回调返回结果为:{res}");
};

示例二:

 1   //声明委托
2 Func<JbaoTokenUserModel, EDIGetCMSReqMode, JsonStdrtn> GetCMSDataFun = (mUser, req) =>
3 {
4 var res = stockService.EDIGetCMSData(mUser, req);
5 return res;
6 };
7
8 //AsyncCallback GetCMSDataCallback = (result) =>
9 //{
10 // var res = ((Func<JbaoTokenUserModel, EDIGetCMSReqMode, JsonStdrtn>)result.AsyncState).EndInvoke(result);
11
12 //};
13 var asyncResult = GetCMSDataFun.BeginInvoke(new JbaoTokenUserModel(), reqModel, null, GetCMSDataFun);
14
15 jr = GetCMSDataFun.EndInvoke(asyncResult);

Net异步委托-泛型委托Action<T>与Func<T,TResult>及 异步调用AsyncCallback的更多相关文章

  1. 委托, 泛型委托,Func<T>和Action<T>

    使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyD ...

  2. 【C#复习总结】细说泛型委托

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  3. C#编程(三十)----------泛型结构,泛型方法,泛型委托

    泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与 ...

  4. 通过Func 委托理解委托和匿名方法及Lambda 表达式

    Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...

  5. Func<T, TResult> 委托

    Func<T, TResult> 委托 Visual Studio 2008   命名空间:  System程序集:  System.Core(在 System.Core.dll 中) 语 ...

  6. Func<T>与Action<T>委托泛型介绍:转

    .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...

  7. Func<T>与Action<T>委托泛型介绍

    .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...

  8. 泛型委托 Predicate/Func/Action

    Predicate 泛型委托  表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.看看下面它的定义: // Summar ...

  9. C#的泛型委托Predicate/Func/Action(转)

    Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 类型参数介绍:    T: 要比较的对 ...

  10. .NET中的Action及Func泛型委托

    委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基 ...

随机推荐

  1. zabbix(历史数据保留时长和趋势存储时间的区别)

    zabbix(历史数据保留时长和趋势存储时间的区别)? zabbix(历史数据保留时长和趋势存储时间分别影响着哪里)? 001.影响grafana 数据展示的是历史数据还是趋势数据? 等把<历史 ...

  2. Asp.Net Core中使用日志组件log4net

    我们在开发任何项目过程中,记录各种日志是太正常不过的事情.没有日志记录的项目,也不可能放心进入生产环境运行.因此日志的记录,是必须要做的. 在.NET开发中,log4net是个常用的日志组件.本文简单 ...

  3. Oracle查看异常未提交事务

    1.查看归档日志都有哪些 SELECT * from v$archived_log 2.查看某个SCN号的归档文件是否存在 SELECT * from v$archived_log WHERE 113 ...

  4. string 截取分割定位

    截取 public String substring(int beginIndex, int endIndex),返回新的字符串,参数为 前闭后开 public String substring(in ...

  5. sed编辑器

    sed sed是一个非交互式的流文本编辑器,可实现增删改查,广泛适用于shell脚本中 工作原理 sed每次只从文本或标准输入中读取一行数据,将其拷贝到一个编辑缓冲区,然后对其如同命令一般处理,并显示 ...

  6. nebula命令行无法查看配置信息

    版本为nebula2.0.1 正在部署集群,节点数比较多,直接在一个节点配置好配置文件,分发到其他节点, 为了减少后续修改配置文件时再为配置文件添加--local_config=true,所以直接加上 ...

  7. Html5本地存储概念,有什么优点,与cookie有什么区别?

    html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...

  8. C++ push_back()函数应用

    最近在学习Opencv,用C++写程序,做了一个虚拟画笔的项目,即通过摄像头采集视频图像信息,识别视频中的画笔,并画笔在空中的划痕显示在视频图像上.在进行到划痕显示的,由于视频是实时采集的,检测到的画 ...

  9. 48. Rotate Image via java

    need to use scratch to find the pattern class Solution { public void rotate(int[][] matrix) { int n= ...

  10. 5 hashlib模块

    import hashlib def gen_md5(origin): """md5加密""" ha = hashlib.md5(b'lkp ...