C# async/await使用举例

1、async/await几点总结

  a、被async标记的方法,返回值类型只能为voidTaskTask<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行结果显示。表明,主线程结束,异步任务未完成也结束。

部分内容参考:https://www.cnblogs.com/sheng-jie/p/6471986.html

原文地址:https://www.cnblogs.com/mojiejushi/p/13200748.html