Net异步委托-泛型委托Action<T>与Func<T,TResult>及 异步调用AsyncCallback
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可以做以下工作:
- 做一些其他操作,然后调用EndInvoke方法阻塞线程直到该方法完成。
- 使用IAsyncResult.AsyncWaitHandle属性,使用它的WaitOne方法阻塞线程直到收到WaitHandle信号,然后调用EndInvoke。
- 检查BeginInvoke返回值IAsyncResult的状态来决定方法是否完成,然后调用EndInvoke方法。
- 通过在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的更多相关文章
- 委托, 泛型委托,Func<T>和Action<T>
使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyD ...
- 【C#复习总结】细说泛型委托
1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...
- C#编程(三十)----------泛型结构,泛型方法,泛型委托
泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与 ...
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
Func<T, TResult> 委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 命名空间: System 程序集: mscorlib(在 mscorlib.d ...
- Func<T, TResult> 委托
Func<T, TResult> 委托 Visual Studio 2008 命名空间: System程序集: System.Core(在 System.Core.dll 中) 语 ...
- Func<T>与Action<T>委托泛型介绍:转
.Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...
- Func<T>与Action<T>委托泛型介绍
.Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...
- 泛型委托 Predicate/Func/Action
Predicate 泛型委托 表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.看看下面它的定义: // Summar ...
- C#的泛型委托Predicate/Func/Action(转)
Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 类型参数介绍: T: 要比较的对 ...
- .NET中的Action及Func泛型委托
委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基 ...
随机推荐
- (二)REDIS-重要概念与原理
1 Redis的概念: Redis是一种key-value类型的内存数据库,可以用于保存string,list,set,sorted set,hash等多种数据结构.由于整个数据库统统加载在内存中进行 ...
- Msp430 编写交通灯程序
题目:我想想... 红灯亮,按下按键后倒计时10秒,倒计时十秒后,绿灯点亮,红灯熄灭,进入绿灯的15秒倒计时,在只剩下3秒的时候,绿灯闪烁. 代码如下,有点麻烦 当时这么写的 就不改了 #includ ...
- jwt刷新token
前一段时间讲过了springboot+jwt的整合,但是因为一些原因(个人比较懒)并没有更新关于token的刷新问题,今天跟别人闲聊,聊到了关于业务中token的刷新方式,所以在这里我把我知道的一些点 ...
- 解决GitHub网页githubusercontent地址无法访问问题
问题 解决GitHub网页githubusercontent地址无法访问问题 解决方法: 参考链接:https://zhuanlan.zhihu.com/p/107691233 注意 安装有火绒的,可 ...
- Word06 黑客技术office真题
1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...
- css实现文字多余显示省略号
只显示一行文字 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 显示多行文字 word-break:break-all; ...
- 查看Linux操作系统版本命令
(一)查看操作系统版本的方法 1.uname -a 可以查看内核版本等信息 Linux test 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:4 ...
- 肖sir__面试第十天课程__模拟面试讲解
一.面对面模拟面试1.打印好简历2.带好手机,录制自己回答的问题,总结,反思(内部),关闭手机和闹钟(外部)3.有笔试题,可以拍照发群里4.可以携带耳塞(适合女生)5.语速流程6.礼貌用语(面试官好, ...
- Ubuntu tmux使用教程
sudo apt-get install tmux 安装tmux tmux new -s session_name 新开一个会话 tmux a -t session_name 查看指定会话 tmux ...
- Redis设计实现-学习笔记
最近在准备面试,问到redis相关知识,只能说个皮毛,说的既不深入也不全面,所以抓紧突击一下,先学<redis设计与实现>. 选择看书的原因是: 书中全面深入,且能出书一定十分用心: 搜博 ...