C#:Func的同步、异步调用(转)
实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例:
有一个现成的类MyMath,里面有一个Add方法:

1 public class MyMath
2 {
3
4 public int Add(int a, int b)
5 {
6 System.Threading.Thread.Sleep(5000);
7 return a + b;
8 }
9
10 }

对Add方法做下封装,对了对比,同时提供“同步调用”与"异步调用"二个版本:

1 /// 异步调用
2 /// </summary>
3 /// <param name="a"></param>
4 /// <param name="b"></param>
5 /// <param name="callBackAction"></param>
6 /// <returns></returns>
7 static void AyscAdd(int a, int b, Action<int> callBackAction)
8 {
9 Func<int> func = () =>
10 {
11 return new MyMath().Add(a, b);
12 };
13 func.BeginInvoke((ar) =>
14 {
15 var result = func.EndInvoke(ar);
16 callBackAction.Invoke(result);
17 },
18 null);
19
20 }
21
22 /// <summary>
23 /// 同步调用
24 /// </summary>
25 /// <param name="a"></param>
26 /// <param name="b"></param>
27 /// <returns></returns>
28 static int SyncAdd(int a, int b)
29 {
30 return new MyMath().Add(a, b);
31 }

最后调用验证:

1 static void Main(string[] args)
2 {
3 Console.WriteLine("同步调用开始=>");
4 int a = SyncAdd(1, 2);
5 Console.WriteLine("同步调用结束:" + a);
6
7 Console.WriteLine("--------------------------");
8
9 Console.WriteLine("异步调用开始=>");
10 AyscAdd(3, 4, (result) =>
11 {
12 Console.WriteLine("异步调用结果:" + result);
13 });
14 Console.WriteLine("异步调用结束");
15
16 Console.ReadLine();
17 }

完整代码:

1 using System;
2
3 namespace ActionDemo
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 Console.WriteLine("同步调用开始=>");
10 int a = SyncAdd(1, 2);
11 Console.WriteLine("同步调用结束:" + a);
12
13 Console.WriteLine("--------------------------");
14
15 Console.WriteLine("异步调用开始=>");
16 AyscAdd(3, 4, (result) =>
17 {
18 Console.WriteLine("异步调用结果:" + result);
19 });
20 Console.WriteLine("异步调用结束");
21
22 Console.ReadLine();
23 }
24
25 /// <summary>
26 /// 异步调用
27 /// </summary>
28 /// <param name="a"></param>
29 /// <param name="b"></param>
30 /// <param name="callBackAction"></param>
31 /// <returns></returns>
32 static void AyscAdd(int a, int b, Action<int> callBackAction)
33 {
34 Func<int> func = () =>
35 {
36 return new MyMath().Add(a, b);
37 };
38 func.BeginInvoke((ar) =>
39 {
40 var result = func.EndInvoke(ar);
41 callBackAction.Invoke(result);
42 },
43 null);
44
45 }
46
47 /// <summary>
48 /// 同步调用
49 /// </summary>
50 /// <param name="a"></param>
51 /// <param name="b"></param>
52 /// <returns></returns>
53 static int SyncAdd(int a, int b)
54 {
55 return new MyMath().Add(a, b);
56 }
57 }
58
59 public class MyMath
60 {
61
62 public int Add(int a, int b)
63 {
64 System.Threading.Thread.Sleep(5000);
65 return a + b;
66 }
67
68 }
69 }

输出结果如下:
同步调用开始=>
同步调用结束:3
--------------------------
异步调用开始=>
异步调用结束
异步调用结果:7
C#:Func的同步、异步调用(转)的更多相关文章
- dubbo同步/异步调用的方式
我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用(默认) 异步调用 参数回调 事件通知 同步 ...
- .Net下的MSMQ(微软消息队列)的同步异步调用
一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列 和电子邮件有着很多相似处,他们都包含多个属性, ...
- jQuery同步/异步调用后台方法
$.ajax({ type: "Post", url: "UserManage.aspx/SubmitPage",//页面/方法名 data: "{' ...
- ajax 同步异步调用
- C#:Func的同步、异步调用
using System; namespace ActionDemo { class Program { static void Main(string[] args) { Console.Write ...
- C# Func的同步、异步调用
using System; namespace ActionDemo { class Program { static void Main(string[] args) { Console.Write ...
- C#的同步和异步调用方法
同步和异步大家都明白什么意思,在这里不多介绍了. namespace ConsoleTest { class Program { static void Main(string[] args) { C ...
- python 并发编程 同步调用和异步调用 回调函数
提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
随机推荐
- git常用知识整理
分布式和集中版本控制的区别 分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因 ...
- ios 内存管理 心得
- alloc, copy, retain会把引用计数+1 - release会把引用计数-1 - 局部变量如果初始化时不是autorelease的,要及时调用release释放,并且赋值为nil否则 ...
- T-SQL:SQL Server-数据库查询语句基本查询
ylbtech-SQL Server-Basic:SQL Server-数据库查询语句基本查询 SQL Server 数据库查询语句基本查询. 1,数据库查询语句基本查询 数据库 SQL Serv ...
- cookie跨域,跨目录访问及单点登录。
首先普及下域名的知识: 域名: baidu.com // 一级域名 A play.baidu.com // 二级域名 B abc.play.baidu.com // 三级域名 C 数有几 ...
- c++中调用cygwin/x使用ncl
1.C++中调用程序: ShellExecute(NULL,L"open",L"cmd.exe",L"/c d: & cd cygwin ...
- IntelliJ IDEA 13 Keygen
import java.math.BigInteger; import java.util.Date; import java.util.Random; import java.util.zip.CR ...
- Unreal Engine 虚幻引擎宣布对开发者免费
虚幻引擎4现在可供每个人免费使用,而且所有未来的更新都将免费!您可以下载引擎并将其用于游戏开发的各个方面,包括教育.建筑以及可视化,甚至虚拟现 实.电影和动画. 当您发布游戏或应用时,在您的每个游戏在 ...
- MVC&&MVP
Classic MVC Classic MVC 大概上世纪七十年代,Xerox PARC的Trygve提出了MVC的概念. 并应用在Smalltalk系统中,为了和其它类型的MVC加以区分,历史上习惯 ...
- 在Spring MVC中使用注解的方式校验RequestParams
概述 Spring MVC支持Bean Validation,通过这个验证技术,可以通过注解方式,很方便的对输入参数进行验证,之前使用的校验方式,都是基于Bean对象的,但是在@RequestPa ...
- linux下使用libiconv库转码
iconv命令实现linux下字符集编码的转换 windows下的文件复制到linux下时常会乱码,因为windows下文件编码为GBK,linux下默认文件编码为UTF-8,故需要libiconv库 ...