async方法:async+await

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7 
 8 namespace 異步
 9 {
10     class AwaitAsyncShow
11     {
12 
13 
14         #region 沒有await前提下與普通方法無異
15         /// <summary>
16         /// 注:async與await要成對出現,不然生命async方法無效
17         /// async與await只能在方法中聲明,以下
18         /// </summary>
19         public static async void Show()  //這裏有警告正常
20         {
21             Console.WriteLine("開始執行前...");
22             Task task = Task.Run(() =>
23             {
24                 Console.WriteLine("這裏是異步多線程開始調用......");
25             });
26             //若是在task後面不加await,則只能當成普通方法使用,且不會有線程等待
27             Console.WriteLine("開始執行後...");
28         }
29         #endregion
30 
31         #region 異步方法await+async
32         public static void Invoke()
33         {
34             AwaitShow();// 這裏執行異步方法
35             //在上面的AwaitShow()用await task等待的時候,這裏主線程開始執行下面的任務
36             for (int i = 0; i < 8; i++)
37             {
38                 Console.WriteLine($"這裏由主線程來執行,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......");
39             }
40         }
41 
42         public static async void AwaitShow()
43         {
44             Console.WriteLine($"開始執行前,當前線程id:{Thread.CurrentThread.ManagedThreadId}...");
45             Task task = Task.Run(() =>
46             {
47                 Console.WriteLine($"這裏是異步多線程開始調用1,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......");
48                 Thread.Sleep(2000);
49                 Console.WriteLine($"這裏是異步多線程開始調用2,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......");
50             });
51             await task; //主線程到這裏就返回到上面的Invoke()方法中,去執行別的任務去了
52 
53             //後面的這句話當成了一個委託,task的回調函數了,等到task子線程執行完後執行這句話
54             //這個回調線程是不肯定的,能夠是主線程,也能夠是子線程
55             Console.WriteLine($"開始執行後,當前線程id:{Thread.CurrentThread.ManagedThreadId}...");
56         }
57         #endregion
58 
59 
60         #region 帶返回值得async異步方法,沒有return語句,反人類
61         public static async Task NoReturnTask()
62         {
63             Console.WriteLine($"開始執行前,當前線程id:{Thread.CurrentThread.ManagedThreadId}...");
64             Task task= Task.Run(() =>
65             {
66                 Console.WriteLine($"這裏是異步多線程開始調用1,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......");
67                 Thread.Sleep(2000);
68                 Console.WriteLine($"這裏是異步多線程開始調用2,當前線程ID爲:{Thread.CurrentThread.ManagedThreadId}......");
69             });
70             await task;  //在這裏直接返回task,吊不弔 
71 
72             //注:這裏至關沒有返回值,最好不要用void類型,可用Task類型
73         }
74         #endregion
75 
76         #region 更反人類的返回類型
77         public static async Task<long> SumAsync()
78         {
79             Console.WriteLine($"開始執行前,當前線程id:{Thread.CurrentThread.ManagedThreadId}...");
80             long sum = 0;
81             await Task.Run(() => 
82             {
83                 for (int i = 0; i < 10000000; i++)
84                 {
85                     sum += i;
86                 }
87             });
88             Console.WriteLine($"開始執行後,當前線程id:{Thread.CurrentThread.ManagedThreadId}...");
89             return sum;  //返回類型明明是Task<long>類型,但返回值倒是long類型,就像返回一個委託同樣
90 
91             //若是要返回一個類型值,請用Task<T> 至關於委託
92         }
93         #endregion
94     }
95 }

 

主程序調用多線程

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 異步
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             AwaitAsyncShow.Invoke();
14 
15             //這裏調用帶返回值的async方法
16             Task<long> sumTask = AwaitAsyncShow.SumAsync();
17             long result = sumTask.Result;
18             Console.WriteLine($"sum結果爲:{result}");
19             Console.ReadLine();
20         }
21     }
22 }

 執行結果異步

相關文章
相關標籤/搜索