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

时间: 2024-11-01 12:04:34

C#:Func的同步、异步调用(转)的相关文章

同步异步调用的一些小问题

随着项目第一次真正接触.使用了同步和异步.记录一下有一些个人的赶脚: .NET现在提供了一个很方便的功能: async, await. 1. 标识为了async的方法便是异步方法,该类方法的返回值只能是void或者Task<T>.(如:Task<bool> PingAsync();) 2. 当需要获得该异步方法的返回值的时候,在调用处必须要用await来标明:可以理解为等待这个异步方法的返回值.(如:var result = await _serverFacade.PingAsyn

同步调用和异步调用同时存在导致的混乱

其实在Promise之外也存在这个问题,这里我们以一般的使用情况来考虑此问题.这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用.下面我们以 onReady(fn) 为例进行说明,这个函数会接收一个回调函数进行处理. mixed-onready.js function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' ||

java三种调用方式(同步调用/回调/异步调用)

1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 ) 实例2:老师平时学生布置任务后不可能一直等待和监督学生完成,老师通常会告诉学生,任务完成后给他打个电话或者发个信息,那么学生给老师返回结果的过程需要老师信息,这就是一个回调的过程.

C#同步和异步调用

这篇文章仅当总结之用,参考了很多前辈们的文章,加上了点点自己的理解 C#的同步和异步线程是依靠委托来完成,主要需要用到委托的Invoke方法,BeginInvoke和EndInvoke方法 所谓同步线就是阻塞当前线程来完成调用的方法,然后才继续调用当前线程的后面的操作,实际上都是在同一个线程中执行,效率不高.需要用到Invoke方法 异步线程不阻塞当前线程,而是把需要调用的方法加入线程池中,来同步执行,即同一时间两个及其以上的线程共同都在执行,效率很高.需要用到BeginInvoke和EndIn

C# 委托的三种调用示例(同步调用 异步调用 异步回调)

本文将主要通过同步调用.异步调用.异步回调三个示例来讲解在用委托执行同一个加法类的时候的的区别和利弊 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { public static int Add(int a, int b) { Console.WriteLine("开始计算:" + a + "+" + b); Thread.Slee

C#委托调用(同步调用,异步调用,异步回调)

#region 委托回调 static void delegateTest() { Console.WriteLine("同步调用"); SubDelegate subDel = Sub; var result = subDel.Invoke(3, 4); Console.WriteLine("继续"); Console.WriteLine(result); Console.ReadKey(); Console.WriteLine("异步调用")

WebService 同步调用,异步调用

阅读目录 一:添加WebService服务 二:添加“客户程序”(这里用winform)用于调用WebService服务 三:异步调用过程解释 一:添加WebService服务 1.添加一个空网站项目,2.在项目里面添加一个WebService服务(WebServiceTest.asmx),3.添加“HelloWorld”方法 代码:(WebServiceTest.asmx) using System; using System.Collections.Generic; using System

将同步调用转成异步调用?

有时候同步调用和异步调用同时存在的时候,难免出现混乱. 来看个栗子: function loadReady(callback){ var readyState = document.readyState; if(readyState ==='complete'||readyState==='interactive'){ typeof callback === 'function' && callback(); }else{ window.addEventListener('DOMConte

[SAP ABAP开发技术总结]Function远程、同步、异步调用

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 20.1.         Function调用... 233 20.1.1.     更新FM:LUW.. 233 20.1.2.     RFC函数:远程调用... 234 20.1.2.1.           同步... 234 20.1.2.2.           异步... 234 20.1.2.2.1.       事务性RFC调用... 234 20.1