关于执行顺序和线程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为同一个,不解。若有人明白,烦请解惑。