心安
代码的世界,简单而又直接

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

 

posted on 2021-10-18 11:15  逐梦の心安  阅读(210)  评论(0编辑  收藏  举报