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.事件 ...
随机推荐
- 锋利的jQuery读书笔记---jQuery中Ajax--get、post等方法
load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现ajax的全部价值. 在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或 ...
- suse10的网络配置(静态IP)
感觉跟fedora的差别还是蛮大的, 主要是配置文件的不同, 尤其是默认路由, 多了一个单独的文件ifroute-xxx suse10的网卡配置文件在/etc/sysconfig/network ...
- Spring 框架概述
◆简介 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 Spring 框架是一个分层架构,由 7 个定义良好的模块组成. ...
- B-树和B+树
B-树和B+树是一种平衡的多路查找树,它在文件系统中很有用.一颗m阶的b-树,或为空树,或满足下列特性的m叉树.1)树中每个节点至多有m棵子树2)若根结点不是叶子结点,则至少有两棵子树.3)除根之外的 ...
- Auto Updating the exe from a network location when application starts z
http://www.codeproject.com/Tips/869588/Auto-Updating-the-exe-from-a-network-location-when?msg=499218 ...
- Java 与无符号那些事儿
最近在使用 Java 作为 WebSocket 客户端连接 Node.js 的 WebSocket 服务器的时候,由于使用的客户端库比较老,所以遇到了字节符号的问题,上网查了一下,看到这篇文章写的很有 ...
- 【剑指offer 面试题38】数字在排序数组中出现的次数
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...
- LoadRunner--内存指标介绍
Threads——线程数当前全部线程数============================================ Available MBytes——物理内存的可用数指计算机上可用于运行 ...
- 一个有趣的模拟光照的shader(类似法线贴图)
最近使用unity,碰到到一个很有趣的例子.场景无光线,却模拟出了光照,效果挺好.其思路与法线贴图原理异曲同工. 原作者提供的效果印象深刻. 模型除了使用原来的diffuse贴图外,还用到了一张模拟记 ...
- _margin和margin的区别
_margin和margin的区别 _margin和margin的区别 Question: margin:15px 300px 0px 100px; height:72px; width:188px; ...