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屬性包含了外界傳入的參數信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM