async 聲明一個包含異步代碼的函數,該函數執行時不會阻塞調用線程。
async標記的函數返回值必須為 void ,Task,Task<TResult>
await 必須修飾Task 或者Task<TResult>
await之后的代碼運行線程:對於純console工程,還是耗時任務的線程,
對於winform線程,則是調用線程。
典型代碼
public static async Task<int> CalAsync() { string tid = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("當前位置async函數,await之前,線程ID"+tid); int result = await Task.Run(new Func<int>(Cal)); tid = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("當前位置async函數,await之后,線程ID" + tid); return result; }
全部代碼

class Program { static void Main(string[] args) { string tid = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("當前位置主函數,調用async異步之前,線程ID"+tid); Task<int> t = CalAsync(); Console.WriteLine("當前位置主函數,調用async異步之后,線程ID" + tid); Console.Read(); } public static async Task<int> CalAsync() { string tid = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("當前位置async函數,await之前,線程ID"+tid); int result = await Task.Run(new Func<int>(Cal)); tid = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("當前位置async函數,await之后,線程ID" + tid); return result; } public static int Cal() { string tid = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("當前位置耗時函數,線程ID"+tid); int sum = 0; for (int i = 0; i < 999; i++) { sum = sum + i; } Console.WriteLine("當前位置耗時函數完成,線程ID" + tid); return sum; } }
輸入內容
winform中優雅的實現
private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { Thread.Sleep(5000); return "Returning from TimeConsuming task"; }); this.Text = await t; }
參考