1、async/await几点总结
a、被async标记的方法,返回值类型只能为void
、Task
、Task<T>。
b、被async标记的方法,内部可以有await修饰符,表明内部逻辑某处有异步执行方法。
c、被async标记的方法,内部可以没有await修饰符,所有逻辑将同步执行。
d、task任务执行创建的线程为后台线程,主线如果不Task.result获取结果,主线程结束,异步任务未完成也结束。
f、await关键字:方法要被async修饰,才能在方法内部使用await,await后面必须是一个task或返回task的方法,标记了await,就说明后面的操作是一个异步操作。
2、应用实例
1 static void Main(string[] args) 2 { 3 Console.WriteLine("主线程开始"); 4 Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId); 5 var task = GetLengthAsync(); 6 Console.WriteLine("主线程继续"); 7 var timer = new Stopwatch(); 8 timer.Start(); 9 Console.WriteLine("task的返回值是" + task.Result); 10 timer.Stop(); 11 Console.WriteLine("耗时:" + timer.Elapsed.TotalSeconds + "秒"); //显示时间 12 Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId); 13 Console.WriteLine("主线程结束"); 14 } 15 16 private static async Task<int> GetLengthAsync() 17 { 18 Console.WriteLine("GetLengthAsync()开始"); 19 Console.WriteLine("GetLengthAsync()线程ID:" + Thread.CurrentThread.ManagedThreadId); 20 var str = await GetStringAsync(); 21 Console.WriteLine("GetLengthAsync()线程ID:" + Thread.CurrentThread.ManagedThreadId); 22 Console.WriteLine("GetLengthAsync()执行完毕"); 23 return str.Length; 24 25 } 26 27 private static Task<string> GetStringAsync() 28 { 29 Console.WriteLine("GetStringAsync()开始"); 30 Console.WriteLine("GetStringAsync()线程ID:" + Thread.CurrentThread.ManagedThreadId); 31 Console.WriteLine("GetStringAsync()结束"); 32 return Task.Run(() => 33 { 34 Task.Delay(5000); 35 Console.WriteLine("异步任务开始执行"); 36 Console.WriteLine("异步任务开始执行线程ID:" + Thread.CurrentThread.ManagedThreadId); 37 Console.WriteLine("异步任务耗时10s:"); 38 Thread.Sleep(10000); 39 Console.WriteLine("异步任务执行完毕"); 40 return "异步任务执行结果"; 41 }); 42 43 }
运行结果显示。
注释调9行结果显示。表明,主线程结束,异步任务未完成也结束。