下面为即将被调用的方法:

public delegate int AddHandler(int a,int b);
public class 加法类
{

public static int Add(int a, int b)
  {
     Console.WriteLine("开始计算:" + a + "+" + b);
     Thread.Sleep(1000);
     Console.WriteLine("计算完成!");
     return a + b;
   }

} 

同步调用:

static void Main()
{
  Console.WriteLine("===== 同步调用 SyncInvokeTest =====");
  AddHandler handler = new AddHandler(加法类.Add);
  int result = handler.Invoke(1, 2);
  Console.WriteLine("继续做别的事情。。。");
  Console.WriteLine(result);
  Console.ReadKey();
}

invoke后阻塞主进程,直到handler执行完毕;

异步调用:

static void Main()
 {
   Console.WriteLine("===== 异步调用 AsyncInvokeTest =====");
    AddHandler handler = new AddHandler(加法类.Add);
    //IAsyncResult: 异步操作接口(interface)
    //BeginInvoke: 委托(delegate)的一个异步方法的开始
   IAsyncResult result = handler.BeginInvoke(1, 2, null, null);
   Console.WriteLine("继续做别的事情。。。");
    //异步操作返回
   Console.WriteLine(handler.EndInvoke(result));
   Console.ReadKey();
}

主线程并没有等待,而是直接向下运行了。但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。

异步回调:

用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。

public class 异步回调 {

static void Main()

{

Console.WriteLine("===== 异步回调 AsyncInvokeTest =====");

AddHandler handler = new AddHandler(加法类.Add);             //异步操作接口(注意BeginInvoke方法的不同!)

IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回调函数),"AsycState:OK");

Console.WriteLine("继续做别的事情。。。");

Console.ReadKey();

}

static void 回调函数(IAsyncResult result)

{

//result 是“加法类.Add()方法”的返回值

//AsyncResult 是IAsyncResult接口的一个实现类,空间:System.Runtime.Remoting.Messaging

//AsyncDelegate 属性可以强制转换为用户定义的委托的实际类。

AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;

Console.WriteLine(handler.EndInvoke(result));

Console.WriteLine(result.AsyncState);

}

}

(1)int result = handler.Invoke(1,2);

为什么Invoke的参数和返回值和AddHandler委托是一样的呢?

答:Invoke方法的参数很简单,一个委托,一个参数表(可选),而Invoke方法的主要功能就是帮助你在UI线程上调用委托所指定的方法。Invoke方法首先检查发出调用的线程(即当前线程)是不是UI线程,如果是,直接执行委托指向的方法,如果不是,它将切换到UI线程,然后执行委托指向的方法。不管当前线程是不是UI线程,Invoke都阻塞直到委托指向的方法执行完毕,然后切换回发出调用的线程(如果需要的话),返回。

所以Invoke方法的参数和返回值和调用他的委托应该是一致的。

(2)IAsyncResult result = handler.BeginInvoke(1,2,null,null);

BeginInvoke : 开始一个异步的请求,调用线程池中一个线程来执行,

返回IAsyncResult 对象(异步的核心). IAsyncResult 简单的说,他存储异步操作的状态信息的一个接口,也可以用他来结束当前异步

转载于:https://www.cnblogs.com/xietianjiao/p/5779994.html

委托(delegate)的三种调用方式:同步调用,异步调用,异步回调相关推荐

  1. Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

    Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...

  2. c# 委托实例的几种执行方式详解

    声明委托: 首先,绑定委托方法有如下几种方式: 第一种,直接对符合委托结构的方法进行多绑定: 第二种,绑定匿名方法: 第三种,用等号指定单方法: 注意,第三种绑定方式会将之前所绑定的方法全部解绑,执行 ...

  3. Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...

  4. .NetCore中三种注入方式的思考

    .NetCore中三种注入方式的思考 原文:.NetCore中三种注入方式的思考 该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这 ...

  5. FPGA之道(41)HDL的三种描述方式

    文章目录 前言 三种描述方式 结构化描述方式 数据流描述方式 行为级描述方式 前言 常编写Verilog代码的就会知道,我们对于某一功能的描述,可以通过门电路来描述,也可以直接描述其功能等,这就牵扯到 ...

  6. 【 Verilog HDL 】HDL的三种描述方式

    当我们使用HDL代码描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式.数据流描述方式和行为级描述方式.通过本次总结,我们将明白到底我们描述的电路是什么方式描述的. 结构化描述方式 结构化描 ...

  7. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

  8. 1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式

    1. 有些时候在运行时创建数组由于在编译时创建数组(有些时候不是这样, 比如使用OpenGL绘图和GPU并行计算结合的时候, 需要将大量的数据传送到显存, 每次计算完又要传送回宿主机渲染, 但并不是要 ...

  9. grub安装的 三种安装方式

    1. 引言 grub是什么?最常态的理解,grub是一个bootloader或者是一个bootmanager,通过grub可以引导种类丰富的系统,如linux.freebsd.windows等.但一旦 ...

  10. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

最新文章

  1. win10安装dorcker笔记
  2. python爬虫框架排行榜-Python爬虫框架--pyspider初体验
  3. List结果集使用Java代码遍历以获取String,Object的值
  4. 云原生应用架构转型不好做?阿里云让你一步到位!
  5. 每天一道LeetCode-----链表插入排序
  6. DVWA--File Upload(文件上传)--四个等级
  7. java语法定制混淆,由撇号混淆的textpad语法高亮显示
  8. 找到符合条件的索引_程序员写了多年CRUD,总结出数据库索引这几点值得注意...
  9. 智能门锁半夜离奇开门吓坏用户 官方回应:只是一场误解
  10. MySQL 8.0 的 5 个新特性,太实用了!
  11. Jenkins使用经验谈
  12. 编译调试Apache HTTP Server
  13. 电信光纤天翼网关将默认的路由模式修改为桥接模式
  14. 菜菜的sklearn-01决策树完整版
  15. macos 微信小助手
  16. 纯HTML+CSS实现3D炫酷魔方(相册)
  17. 微信生态圈的发展分析
  18. 生态型协同共建,智能家居平台建设新思路
  19. C/C++找工作这点事
  20. MinIO The access key ID you provided does not exist in our records

热门文章

  1. 【BIEE】14_开发流程介绍
  2. [BZOJ 3622]已经没有什么好害怕的了(Dp+容斥原理)
  3. POJ 1182 食物链
  4. [转]Eclipse遇到的常见问题
  5. 搭建VSFTPD服务器 虚拟用户认证方式
  6. \r\n的来历与用法
  7. Hibernate N+1 问题
  8. Matlab DIP(瓦)ch5图像复原练习
  9. 通过ssh登陆linux后使用vim时按了ctrl+s
  10. 挑战性题目DSCT302:求不同形态的平衡二叉树数目