C#中委托实现的异步编程

Posted 一品码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中委托实现的异步编程相关的知识,希望对你有一定的参考价值。

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

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

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(1000 * 3);//假如计算需要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(1, 2);
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(1, 2, 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(1000 * 10);//假如计算需要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(1, 2, null, null);
19 
20             Console.WriteLine("我不参与计算,先走了啊!");
21 
22             Console.WriteLine("正在努力计算:");
23             while (ret.IsCompleted == false)
24             {
25                 Console.Write(".");
26                 System.Threading.Thread.Sleep(1000);
27             }
28 
29             int amount = action.EndInvoke(ret);
30 
31             Console.WriteLine("-----------程序运行结束----------");
32 
33             Console.ReadKey();
34         }

2.3 运行结果:

技术分享

 

以上是关于C#中委托实现的异步编程的主要内容,如果未能解决你的问题,请参考以下文章

C#中委托如何使用?

c#中委托的作用是啥?

c#中委托怎么用

关于C#中委托的多播应用问题

.NET中委托性能的演变

细说委托