C#:Func的同步、异步调用

简介: 实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Add方法:  1 public class MyMath 2 { 3 4 public...

实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例:

有一个现成的类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 }
View Code

输出结果如下:

同步调用开始=>
同步调用结束:3
--------------------------
异步调用开始=>
异步调用结束
异步调用结果:7

 

目录
相关文章
|
3月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
62 4
|
5月前
|
C#
蓝易云 - C#将异步改成同步方法
注意:虽然这样可以将异步方法转为同步,但在实际开发中,我们通常推荐使用异步方法,因为它可以提高应用程序的响应性和并发性。将异步方法转为同步可能会导致死锁或性能问题。
43 2
|
6月前
|
C#
C#同步异步详解
C#同步异步详解
48 0
|
安全 算法 机器人
Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)
Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)
113 0
Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)
|
存储 编解码 算法
Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机的同步采集(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机的同步采集(C#)
130 0
|
存储 前端开发 API
C# 从做早餐看同步异步
C# 从做早餐看同步异步
55 0
|
SQL 数据库 C#
C#中将DataGrid上的修改同步到SQL Server数据库中
C#中将DataGrid上的修改同步到SQL Server数据库中
|
API C# Windows
C#多线程(4):进程同步Mutex类
C#多线程(4):进程同步Mutex类
259 0
C#多线程(4):进程同步Mutex类
C#委托/Func()中 GetlnvocationList()方法的使用 | 接受委托多个返回值
C#委托/Func()中 GetlnvocationList()方法的使用 | 接受委托多个返回值
288 0
C#委托/Func()中 GetlnvocationList()方法的使用 | 接受委托多个返回值
|
开发框架 Java .NET
C# 同步 异步 回调 状态机 async await Demo
C# 同步 异步 回调 状态机 async await Demo 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者说能不能用async await的方式调用WCF服务呢?
576 0
C# 同步 异步 回调 状态机 async await Demo