你是否曾經與我一樣不理解async,await與task.wait()或者task.Result的區別?
接下來,一個Demo讓你看出他們之間的區別。
static void Main(string[] args) { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:start"); Test(); //不等待 Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:end"); Console.Read(); } static Task<int> Sleep() { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep start"); Thread.Sleep(1000); Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep end"); return Task.FromResult(100); } static Task<int> Test() { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test start"); var a=Task.Run(Sleep).Result;//由上一篇文章可知Run將會在線程池內調度執行 Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test end"); return Task.FromResult(a); }
運行結果:
1:start
1:Test start
4:Sleep start
4:Sleep end
1:Test end
1:end
由此可以看出Task.Result會阻塞主線程。
static void Main(string[] args) { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:start"); TestAsync();//不等待 Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:end"); Console.Read(); } static Task<int> Sleep() { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep start"); Thread.Sleep(1000); Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Sleep end"); return Task.FromResult(100); } static async Task<int> TestAsync() { Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test start"); var a = await Task.Run(Sleep); Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:Test end"); return a; }
運行結果:
1:start
1:Test start
4:Sleep start
1:end
4:Sleep end
4:Test end
async,await不會阻塞主線程