委托的问题 - 用委托实现回调

原创 2016年09月16日 09:35:13

C#委托的问题 - 用委托实现回调


今天看到一个非常好的小例子,内容是这样:


我:”儿子,去把院子里的草割一下,我想读会儿书。”

儿子:“爸爸,我已经把院子打扫干净了。”

儿子:“爸爸,我给割草机加好油了。”

儿子:“爸爸,割草机启动不了。“

我:”我来看看。“

儿子:”爸爸我昨完了。“


上面这段很短的交流掩饰了回调(CallBack)的概念。我给儿子一个任务,他在完成任务期间不断地打断我。在等待他完成任务的每一步骤时,我不需要停下自己的工作。当他有一个重要(或者不重要)的状态需要报告,或者需要我的协助时,他可以不时地打断我。回调可为服务器和客户机之间提供异步的反馈。其中可能会牵扯到多线程,或者需要为同步更新提供一个入口点,在C#中,回调是用委托来实现的。

委托为我们提供了类型安全的回调定义。虽然大多数常见的委托应用都和事件相关,但这并不是C#委托应用的全部场合。当类之间有通信的需要,并且我们期望一种比接口所提供的更为松散的耦合机制时,委托便是最佳的选择。委托允许我们在运行时配置目标并通知多个客户对象。委托对象中包含一个方法引用,该方法可以是静态方法,也可以是实例方法。使用委托,我们可以和一个或多个在运行时联系起来的客户对象进行通信。

回调和委托在C#中非常常用,以至于C#特地的以lambda表达式的形式为其提供了精简的语法。此外,.NET Framework还是用Predicate<T>  ,  Action<> Func<>内建了很多常用的委托形式。Predicate<T>表示一个提供bool类型返回值的函数,用来测试某个条件。Func<>将接受一系列的参数,并返回单一的结果。可以看到,Func<T , bool>的含义其实和Predicate<T>是一样的。但是编译器不会将Predicate<T>Func<T,bool>当成同样的语句来处理。最后Action<>可以接受任意数目的参数,但不返回任何值。


LINQ中大量地使用了这样的概念。List<T>中也包含了很多讲用到回调的方法,例如下面这段代码:


List<Int> numbers = Enumerable.Range(1,200).ToList();
var oddNumbers = numbers.Find(n=> n%2 ==1);
var test = numbers.TrueForAll(n => n  < 50);
number.RemoveAll(n => n%2 ==0);
number.ForEach(item => Console.WriteLine(item));

Find()方法将以Predicate<int>的形式接受一个委托,注意检查列表中的每一个元素,这是个简单的回调。Find()方法使用该毁掉检查每个元素,并返回通过检验逻辑的个数。编译器将接受并把该lambda表达式转换成委托,然后用委托来实现回调。

TrueForAll() 与其类似,也会检查每个元素,并判断是否每个元素都通过了检查,RemoveAll()则从列表中移除所有满足指定条件的元素。

最后,List.ForEach()方法将在列表的每一个元素上执行某些动作。与前面一样,半年一起将5把lambda表达式转换成方法,然后创建一个委托,指向该方法。



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013542549/article/details/52554036

MSDN中回调函数的讲解及其C#例子:用委托实现回调函数

ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingcallbackfunctions.htm回调函数是托管应用程序中可帮助非托管 DLL...
  • sizheng0320
  • sizheng0320
  • 2007-05-18 23:25:00
  • 4237

用委托实现回调

委托属于C#中的新名词,它的应用也非常广泛,例如事件就是委托最简单而又直接的例子。   那么首先说说什么是委托,其实委托在用过C或者C++的人看来就是函数指针,不过使用C#的大多数人都没有用过这两...
  • yanguan55
  • yanguan55
  • 2013-01-24 14:35:22
  • 942

简单的C++委托 —— 用模板类实现类成员函数的回调

原文:http://www.cppblog.com/Zezese/archive/2010/07/25/121247.html   C++语言: 高亮代码由发芽网提供 template clas...
  • wag2765
  • wag2765
  • 2016-01-25 16:37:58
  • 398

C#中委托、事件和回调函数的理解

C# 委托 事件 回调
  • hit_why
  • hit_why
  • 2017-01-18 22:39:19
  • 6923

C#<em>回调</em>函数<em>委托</em>源码

C# <em>回调</em>函数<em>委托</em>源码,可直接运行,有助于初学者理解<em>委托</em>和<em>回调</em>。其实<em>回调</em>就是<em>委托</em>的一种用法 综合评分:5(3位用户评分) 收藏评论(2)举报 所需: 3积分/C币 ...
  • 2018年03月28日 00:00

详解C#委托,事件与回调函数

原文地址:http://www.cnblogs.com/birdshover/archive/2008/01/07/1029471.html 详解C#委托,事件与回调函数 ...
  • bai596140538
  • bai596140538
  • 2016-12-21 13:56:27
  • 223

C# 委托 回调 操作UI主线程 学习笔记

本篇相当于是对前面两篇博的一个简单总结,相当于为c#开发桌面程序有了一个多线程的应用方案。涉及了委托传参,回调委托,跨线程等。下面先直接上代码: 这段代码实现了,点Start按钮,开始更新进度条,当...
  • baidu_31981559
  • baidu_31981559
  • 2016-05-27 17:09:28
  • 3521

c#使用委托实现异步调用

异步编程是受公共语言运行库的许多领域(如远程处理、ASP.NET 和 Windows 窗体)支持的功能。异步编程是 .NET Framework 中的核心概念。使用 .NET 异步编程,在程序继续执行...
  • tangpeicheng
  • tangpeicheng
  • 2006-12-03 00:52:00
  • 4886

c#委托的异步调用 简单示例

委托的异步调用有时,如果要让委托去完成一个复杂耗时的任务时,同步调用不是一个好的选择,因为这样用户面临的是无聊的时间消耗和漫长(相对来说)的等待。这时委托的异步调用就体现出了优势,关于委托的异步调用C...
  • csharp25
  • csharp25
  • 2011-06-18 11:35:00
  • 1984

C#事件与委托,事件与回调的用法区别

事件包括:事件发送者、事件接收者和事件处理程序。 关于事件,我们首要知道的是事件的发送者必须知道发送什么类型的事件,以及相关 的事件参数。而事件的接收者必须了解其事件的处理方法必须使用的返回类型和...
  • huang9012
  • huang9012
  • 2014-08-22 11:30:14
  • 3072
收藏助手
不良信息举报
您举报文章:委托的问题 - 用委托实现回调
举报原因:
原因补充:

(最多只允许输入30个字)