async和await执行顺序

关于执行顺序和线程ID,写了一个小程序来检测学习:

 

 1 using System;
 2 using System.Net;
 3 using System.Threading;
 4 using System.Threading.Tasks;
 5 
 6 namespace AsyncOrder
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             Console.WriteLine($"Main: befor Task1 。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
13             const string url1 = "http://www.163.com/";
14             const string url2 = "http://www.baidu.com/";
15 
16             Task<string> t1 = p1(1, url1);
17             Task<string> t2 = p1(2, url2);
18 
19             DoSomeThing(3, "main");
20 
21             Console.WriteLine($"网页:{url1}长度:{t1.Result.Length}。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
22             Console.WriteLine($"网页:{url2}长度:{t2.Result.Length}。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
23 
24             DoSomeThing(4, "main");
25 
26             Console.WriteLine("按任意键退出...");
27             Console.ReadKey();
28         }
29 
30         private static async Task<string> p1(int id, string url = "http://www.baidu.com")
31         {
32             DoSomeThing(id,"P1");
33             Console.WriteLine($"任务ID:{id} ,p1: befor await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
34             string ret = await p2(id,url);
35             Console.WriteLine($"任务ID:{id} ,p1: after await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
36             return ret;
37         }
38 
39         private static async Task<string> p2(int id, string url = "http://www.baidu.com")
40         {
41             DoSomeThing(id, "P2");
42             Console.WriteLine($"任务ID:{id} ,p2: befor await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
43             string ret = await GetWeb(id, url);
44             Console.WriteLine($"任务ID:{id} ,p2: after await。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
45             return ret;
46         }
47 
48         private static void DoSomeThing(int id, string v)
49         {
50             Console.WriteLine($"任务ID:{id} ,父程序:{v}。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
51         }
52 
53         private static async Task<string> GetWeb(int id , string url = "http://www.baidu.com")
54         {
55             var wc = new WebClient();
56             Console.WriteLine($"任务ID:{id} ,GetWeb: befor await wc。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
57             var temp = await wc.DownloadStringTaskAsync(url);
58             Console.WriteLine($"任务ID:{id} ,GetWeb: after await wc。 线程ID:{Thread.CurrentThread.ManagedThreadId}");
59             return temp.ToString();
60         }
61     }
62 }

 

执行结果为:

 注意:有的时候任务1 2中的await之后的线程ID为同一个,不解。若有人明白,烦请解惑。

posted @ 2019-10-28 10:36  Sunky  阅读(497)  评论(0编辑  收藏  举报