using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace await和async { class Program { static void Main(string[] args) { //AwaitAsync(); //TaskRun(); AwaitTaskRun(); } #region await和async private static void AwaitAsync() { Say(); //因爲Main不能使用async標記 Console.ReadLine(); } private async static void Say() { var t = TestAsync(); Thread.Sleep(1100); //主線程在執行一些任務 Console.WriteLine("Main Thread"); //主線程完成標記 Console.WriteLine(await t); //await 主線程等待取異步返回結果 } static async Task<string> TestAsync() { return await Task.Run(() => { Thread.Sleep(1000); //異步執行一些任務 return "Hello World"; //異步執行完成標記 }); } #endregion #region task public static void TaskRun() { Console.WriteLine("執行GetReturnResult方法前的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); var strRes = Task.Run<string>(() => { return GetReturnResult1(); }); Console.WriteLine("執行GetReturnResult方法後的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); Console.WriteLine("我是主線程,線程ID:" + Thread.CurrentThread.ManagedThreadId); Console.WriteLine(strRes.Result); Console.WriteLine("獲得結果後的時間:" + DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); Console.ReadLine(); } static string GetReturnResult1() { Console.WriteLine("我是GetReturnResult裏面的線程,線程ID:" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); return "我是返回值"; } #endregion #region AwaitTaskRun /* * await:只能標記在async方法或Task對象前面;等待異步的執行結果。 * async:標記異步方法,裏面有異步執行則異步,沒有則爲普通方法,只能返回void、Task、Task<T> */ public static void AwaitTaskRun() { Console.WriteLine("我是主線程,線程ID:{0}", Thread.CurrentThread.ManagedThreadId); TestAsync1(); Console.ReadLine(); } static async void TestAsync1() { Console.WriteLine("調用GetReturnResult()以前,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); var name = GetReturnResult(); Console.WriteLine("調用GetReturnResult()以後,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); Console.WriteLine("獲得GetReturnResult()方法的結果:{0}。當前時間:{1}", await name, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); Console.WriteLine("最後執行,線程ID:{0}。當前時間:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss")); } static async Task<string> GetReturnResult() { Console.WriteLine("執行Task.Run以前, 線程ID:{0}", Thread.CurrentThread.ManagedThreadId); return await Task.Run(() => { Thread.Sleep(3000); Console.WriteLine("GetReturnResult()方法裏面線程ID: {0}", Thread.CurrentThread.ManagedThreadId); return "我是返回值"; }); } #endregion } }
須要等待結果執行,必須全部的方法用await,調用方法的時候也須要。異步