所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码。

异步:如果不等待调用的方法执行完,就执行下一行代码。

1.0 同步例子:

  1. class Program
  2. {
  3. private static int Calculate(int a, int b)
  4. {
  5. Console.WriteLine("1.开始计算!");
  6.  
  7. System.Threading.Thread.Sleep( * );//假如计算需要3秒钟
  8.  
  9. int c = a + b;
  10.  
  11. Console.WriteLine("2.计算完成,结果:{0}+{1}={2}", a, b, c);
  12.  
  13. return c;
  14. }
  15.  
  16. static void Main(string[] args)
  17. {
  18. Console.WriteLine("---------程序运行开始----------");
  19.  
  20. Calculate(, );
  21.  
  22. Console.WriteLine("---------程序运行结束----------");
  23.  
  24. Console.ReadKey();
  25. }
  26. }

1.1 运行结果:

2.0 改用异步调用

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("-----------程序运行开始----------");
  4.  
  5. Func<int, int, int> action = Calculate;//声明一个委托
  6.  
  7. IAsyncResult ret = action.BeginInvoke(, , null, null);
  8.  
  9. Console.WriteLine("1.我不参与计算,先走了啊!");
  10.  
  11. int amount = action.EndInvoke(ret);
  12.  
  13. Console.WriteLine("-----------程序运行结束----------");
  14.  
  15. Console.ReadKey();
  16. }

2.1 运行结果:

2.2 为了提高程序的使用体验,我们可以再计算的时候,每隔一秒钟,打印一个点“.”。整体代码改成如下:

  1. private static int Calculate(int a, int b)
  2. {
  3. System.Threading.Thread.Sleep( * );//假如计算需要3秒钟
  4.  
  5. int c = a + b;
  6.  
  7. Console.WriteLine("\r\n计算完成,结果:{0}+{1}={2}", a, b, c);
  8.  
  9. return c;
  10. }
  11.  
  12. static void Main(string[] args)
  13. {
  14. Console.WriteLine("-----------程序运行开始----------");
  15.  
  16. Func<int, int, int> action = Calculate;//声明一个委托
  17.  
  18. IAsyncResult ret = action.BeginInvoke(, , null, null);
  19.  
  20. Console.WriteLine("我不参与计算,先走了啊!");
  21.  
  22. Console.WriteLine("正在努力计算:");
  23. while (ret.IsCompleted == false)
  24. {
  25. Console.Write(".");
  26. System.Threading.Thread.Sleep();
  27. }
  28.  
  29. int amount = action.EndInvoke(ret);
  30.  
  31. Console.WriteLine("-----------程序运行结束----------");
  32.  
  33. Console.ReadKey();
  34. }

2.3 运行结果:

 3.0 异步回调。以上方式还没有体现异步编程的效果,因为整个计算过程都是在“程序运行开始”和”程序运行结束“之间的。所以还有另外一种实现方式,整体代码改成如下:

  1. private static int Calculate(int a, int b)
  2. {
  3. System.Threading.Thread.Sleep( * );//假如计算需要3秒钟
  4.  
  5. int c = a + b;
  6.  
  7. return c;
  8. }
  9.  
  10. static Func<int, int, int> func = Calculate;//声明一个委托
  11.  
  12. static void Main(string[] args)
  13. {
  14. Console.WriteLine("-----------程序运行开始----------");
  15.  
  16. IAsyncResult ret = func.BeginInvoke(, , ShowFolderSize,"");
  17.  
  18. Console.WriteLine("计算开始:");
  19.  
  20. Console.WriteLine("-----------程序运行结束----------");
  21.  
  22. Console.ReadKey();
  23. }
  24.  
  25. public static void ShowFolderSize(IAsyncResult result)
  26. {
  27. int c = func.EndInvoke(result);
  28. Console.WriteLine("计算完成,结果为:{0}",c);
  29. }

3.1 运行结果:

 3.2 注意回调方法的返回值类型是void,只能有一个IAsyncResult类型的参数,并且要在方法体中调用EndInvoke来取回方法执行的结果,另外result参数的AsyncState属性包含了外界传入的参数信息。

C#中委托实现的异步编程的更多相关文章

  1. 使用C#委托来实现异步编程

    最近在我参与的几个.Net项目中都有用到异步编程,作为一名.Net小白,很有必要好好地学习一下异步编程. 什么是异步编程 异步编程指的就是不用阻塞当前线程来等待任务的完成,而是将任务扔到线程池中去执行 ...

  2. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  3. 在Python中使用asyncio进行异步编程

    对于来自JavaScript编码者来说,异步编程不是什么新东西,但对于Python开发者来说,async函数和future(类似JS的promise)可不是那么容易能理解的. Concurrency ...

  4. ASP.Net中的async+await异步编程

    在.NET Framework4.5框架.C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简 ...

  5. 基于委托的C#异步编程的一个小例子 带有回调函数的例子

    我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.Com ...

  6. 全面解析C#中的异步编程

    当我们处理一些长线的调用时,经常会导致界面停止响应或者IIS线程占用过多等问题,这个时候我们需要更多的是用异步编程来修正这些问题,但是通常都是说起来容易做起来难,诚然异步编程相对于同步编程来说,它是一 ...

  7. 深入理解nodejs中的异步编程

    目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...

  8. C# 异步编程1 APM模式异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

  9. C# 异步编程1 APM 异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

随机推荐

  1. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  2. Java 线程 — ConcurrentHashMap

    ConcurrentHashMap ConcurrentHashMap 结构 采用了分段锁的方法提高COncurrentHashMap并发,一个map里面有一个Segment数组--即多个Segmen ...

  3. dubbo+zookeeper简单环境搭建

    dubbo+zoopeeper例子 [TOC] 标签(空格分隔): 分布式 dubbo dubbo相关 dubbo是目前国内比较流行的一种分布式服务治理方案.还有一种就是esb了.一般采用的是基于Ap ...

  4. Enterprise Solution 2.3

    1. 登陆窗体和主界面增加语言选项,同时可记住用户登陆的语言和数据库. 2. 主界面的树功能可记住上次打开的模块菜单. 3. 修复主界面菜单生成问题和导航图区上下文菜单生成问题. 4. 增加自动更新功 ...

  5. PopupWindow+ListView+OnItemClick点击无效

    昨天踩了个大坑,从下午折腾到现在.实现以下功能: popupWindow显示listview,listView OnItemClick点击后获取值. 由于重写listview 是有两部分 列表正文和右 ...

  6. javascript中数组的22种方法

    × 目录 [1]对象继承 [2]数组转换 [3]栈和队列[4]数组排序[5]数组拼接[6]创建数组[7]数组删改[8]数组位置[9]数组归并[10]数组迭代[11]总结 前面的话 数组总共有22种方法 ...

  7. Testing - 测试基础 - 探索

    定义 探索性测试(Exploratory Testing)是一种自由的软件测试风格,强调测试人员同时展开测试学习,测试设计,测试执行和测试结果评估等活动,以持续优化测试工作. 其特征有:即兴发挥,快速 ...

  8. [工具]Serv-U配置教程

    引言 最近项目中需要用到ftp服务器,将文件放在ftp服务器上,就在网上查了一下,学习了一下Serv-u的配置及使用,这里也将如何配置的做一记录. Serv-u简介 Serv-U 是目前众多的FTP ...

  9. Elasticsearch 动态映射——自动检测

    ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 那么什么是映射呢?映射就是描述字段的类型.如何进行分析.如何进行索引等内 ...

  10. 如何做好一个ORM框架

    很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有用户群体大的ORM有保证,这点是不可否认确是事实. 但是往往用户群体大的ORM又有不足之处,就拿用户群体最多的两个ORM来说一下吧 1.EF ...