当前位置: 首页 > news >正文

C#基础系列问题三委托知识总结2


Action<T>:封装一个方法,该方法只采用一个参数并且不返回值,包括
Action<T>,Action<T1,T2>,Action<T1,T2,T3>,Action<T1,T2,T3,T4>
这几种情况,也可以
通过扩展方法去扩展参数的个数 。

Action 委托使用例子
 1  public  void  TestAction()
 2          {
 3              TEventSource eventSource  =  new  TEventSource();
 4              Action < string >  action  =  eventSource.Speak;
 5              action( " Action<T> 泛型委托 " );
 6          }
 7 
 8           public  void  Speak( string  context)
 9          {
10              Console.WriteLine(context);
11          }

 


Predicate<T>:表示定义一组条件并确定指定对象是否符合这些条件的方法。该委托返回的是一个bool类型的值,如果比较满足条件 

返回true,否则返回false.其实上面的
Func 委托可以包含这个委托.不过这个委托和上面的两个不一样,它只有一种类型

Predicate 委托使用例子
 1  public  void  TestPredicate()
 2          {
 3              TEventSource eventSource  =  new  TEventSource();
 4              Predicate < int >  predicate  =  eventSource.IsRigth;
 5              Console.WriteLine(predicate( 0 ));
 6          }
 7 
 8           public  bool  IsRigth( int  value)
 9          {
10               if  (value  ==  0 )
11              {
12                   return  true ;
13              }
14               else
15              {
16                   return  false ;
17              }
18          }

 

 

6. 异步委托

投票技术: 委托其实相当于一个线程,使用投票技术是使用异步委托的一种实现方式.Delegate类提供了方法BeginInvoke(),可以传送委托类型定义的 输入参数,其返回类型为IAsyncResult。IAsyncResult的IsCompleted属性可以判断委托任务是否完成

异步委托投票技术
 1  public  delegate  int  DelegateVote( int  data,  int  ms);
 2       ///  <summary>
 3       ///  使用投票操作完成委托任务
 4       ///  </summary>
 5       public  class  VoteDelegate
 6      {
 7           ///  <summary>
 8           ///  休眠特定时间执行操作
 9           ///  </summary>
10           ///  <param name="data"></param>
11           ///  <param name="ms"></param>
12           ///  <returns></returns>
13           public  static  int  TakeWork( int  data,  int  ms)
14          {
15              Console.WriteLine( " 开始调用TakeWork方法 " );
16              Thread.Sleep(ms);
17              Console.WriteLine( " 结束调用 TakeWork方法 " );
18               return  data  +  10 ;
19          }
20 
21           public  void  TestDelegate()
22          {
23              DelegateVote voteDel  =  TakeWork;
24              IAsyncResult result  =  voteDel.BeginInvoke( 1 , 5000 , null , null );
25               while  (result.IsCompleted  ==  false )
26              {
27                  Console.WriteLine( " 等待...... " );
28                  Thread.Sleep( 500 );
29              }
30               int  value  =  voteDel.EndInvoke(result);
31              Console.WriteLine( " 委托调用结果:   " + value);
32          }
33      }
等待句柄:等待句柄是使用AsyncWaitHandle属性访问,返回一个WaitHandle类型的对象,它可以等待委托线程完成其任务。在这 个参数中可以设置最大的等待时间。
异步委托等待句柄
 1   public  delegate  string  WaitDelegate( string  content);
 2 
 3       public  class  WaitHandlerDelegate
 4      {
 5           public  void  TestWaitHander()
 6          {
 7              WaitDelegate del  =  GetTea;
 8              IAsyncResult ar  =  del.BeginInvoke( " hechen " null null );
 9               while  ( true )
10              {
11                  Console.Write( " . " );
12                   if  (ar.AsyncWaitHandle.WaitOne( 50 false ))
13                  {
14                       break ;
15                  }
16              }
17               string  result = del.EndInvoke(ar);
18              Console.WriteLine(result);
19 
20          }
21 
22           public  static  string  GetTea( string  content)
23          {
24               return  " 茶来了   " + content;
25          }
26      }
异步回调:这个方式和投票技术有点类似,不过在投票方式中BeginInvoke()方法第三个参数指定了一个方法签名,而这个方法参数接收 IAsyncResult 类型的参数。
异步委托回调函数
 1  public  delegate  string  AsyDelegate( string  content);
 2 
 3       public  class  AsyncresultDelegate
 4      {
 5           public  void  TestAsync()
 6          {
 7              AsyDelegate del  =  GetTea;
 8              del.BeginInvoke( " hechen " delegate (IAsyncResult ar) {
 9                  Thread.Sleep( 5000 );
10                   string  result  =  del.EndInvoke(ar);
11                  Console.WriteLine(result);
12              },  null );
13               for  ( int  i  =  0 ; i  <  100 ; i ++ )
14              {
15                  Console.WriteLine( " 等待..... " );
16                  Thread.Sleep( 1000 );
17              }
18          }
19 
20           public  static  string  GetTea( string  content)
21          {
22               return  " 茶来了   "  +  content;
23          }
24      }

转载于:https://www.cnblogs.com/feiyangqingyun/archive/2011/03/08/1976792.html

相关文章:

  • 软件开发求助 源码+网页
  • 在MS系统中用netsh命令改IP地址。
  • 工作vs.事业
  • 常用缓存软件
  • 命令行安装安全证书
  • 100题_26 和为n连续正数序列
  • 实战Active Directory站点部署与管理,Active Directory系列之十
  • Office 2007免序列号安装的ISO制作方法
  • 继神曲之后的忐忑(解决多款浏览器兼容xml问题)
  • 工业故事:奇瑞的故事(转载)
  • php Socket 入门例子
  • IIS W3C日志记录字段和HTTP状态代码的说明
  • 需求分析的定义(转)
  • 发博文表决心
  • Linux shell 除法运算
  • [Vue CLI 3] 配置解析之 css.extract
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • JavaScript对象详解
  • Java多线程(4):使用线程池执行定时任务
  • laravel5.5 视图共享数据
  • PHP的Ev教程三(Periodic watcher)
  • Sass 快速入门教程
  • 半理解系列--Promise的进化史
  • 技术胖1-4季视频复习— (看视频笔记)
  • 解决iview多表头动态更改列元素发生的错误
  • 老板让我十分钟上手nx-admin
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • hi-nginx-1.3.4编译安装
  • ionic异常记录
  • UI设计初学者应该如何入门?
  • 大数据全解:定义、价值及挑战
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 回归生活:清理微信公众号
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # 计算机视觉入门
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (十)T检验-第一部分
  • (十八)SpringBoot之发送QQ邮件
  • (十五)使用Nexus创建Maven私服
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 4.0中的泛型协变和反变
  • .NET Core 项目指定SDK版本
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...