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 运行结果:

 3.0 异步回调。以上方式还没有体现异步编程的效果,因为整个计算过程都是在“程序运行开始”和”程序运行结束“之间的。所以还有另外一种实现方式,整体代码改成如下:

 1 private static int Calculate(int a, int b)
 2         {
 3             System.Threading.Thread.Sleep(1000 * 3);//假如计算需要3秒钟
 4 
 5             int c = a + b;
 6 
 7             return c;
 8         }
 9 
10         static Func<int, int, int> func = Calculate;//声明一个委托
11 
12         static void Main(string[] args)
13         {
14             Console.WriteLine("-----------程序运行开始----------");
15 
16 
17             IAsyncResult ret = func.BeginInvoke(1, 2, ShowFolderSize,"");
18 
19             Console.WriteLine("计算开始:");
20 
21             Console.WriteLine("-----------程序运行结束----------");
22 
23             Console.ReadKey();
24         }
25 
26         public static void ShowFolderSize(IAsyncResult result)
27         {
28             int c = func.EndInvoke(result);
29             Console.WriteLine("计算完成,结果为:{0}",c);
30         }

3.1 运行结果:

 3.2 注意回调方法的返回值类型是void,只能有一个IAsyncResult类型的参数,并且要在方法体中调用EndInvoke来取回方法执行的结果,另外result参数的AsyncState属性包含了外界传入的参数信息。

posted @ 2016-09-20 17:28  一品码农  阅读(7223)  评论(0编辑  收藏  举报