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. vue cli 项目初始化配置

  2. mysql ID起始值重置方法

    方法一,执行SQL:truncate table `table_name`; 这种方法好处是运行速度超快 方法二,执行如下SQL: (还是假定表名是test)delete from `table_na ...

  3. zabbix如何修改web字体

    1.拷贝一个你喜欢的字体到zabbix-server的/usr/share/zabbix/assets/fonts目录下 2.cd  /usr/share/zabbix vim include/def ...

  4. Python3之并发(六)---线程池

    一.线程池 系统频繁的启动新线程,线程执行完被销毁,如果线程不能被重复使用,即每个线程都需要经过启动.销毁和运行3个过程,这必然会使得系统的性能急剧下降,线程池的意义就在于减少线程创建及消毁过程中损失 ...

  5. sed编辑器

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

  6. CCF 202012-2 期末预测之最佳阈值

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...

  7. Flash、EEPROM、SRAM的区别与理解

    Flash.EEPROM.SRAM的区别与理解1. Flash.EEPROM.SRAM的区别(1) Flash存储器Flash适用于速度要求高.容量要求大.掉电时要求数据不丢失的场合. (2) EEP ...

  8. 1.3 C语言--指针与结构体

    指针 指针概念的引入 关于内存 程序有数据和指令组成,数据和指令在执行过程中存放在内存中.变量是程序数据中的一种,因此变量也存储在内存中:内存中的每个字节都有一个唯一的编码,即内存地址.32位机的内存 ...

  9. tensorflow 模型批处理参数tensor快速赋值参考

    批处理调用模型的时候,如果逐像素给tensor对象数据部分赋值的话,效率是很低的,尤其是对于一些图片数据,所以数据块直接拷贝可以大大提高效率, 先取得数据指针: output_tensor->f ...

  10. Day09-方法

    方法 一.何谓方法 java方法是语句的集合,他们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则: 方法的本意是功能 ...