文中所有Task<TResult>的返回值都是直接用task.result獲取,這樣如果后台任務沒有執行完畢的話,主線程會等待其執行完畢,這樣的話就和同步一樣了(看上去一樣,但其實await的時候並不會造成線程的阻塞,web程序感覺不到,但是wpf,winform這樣的桌面程序若不使用異步,會造成UI線程的阻塞)。簡單演示一下Task回調函數的使用:
Console.WriteLine("主線程開始"); Task<string> task = Task<string>.Run(() => { Thread.Sleep(2000); return Thread.CurrentThread.ManagedThreadId.ToString(); }); //會等到任務執行完之后執行 task.GetAwaiter().OnCompleted(() => { Console.WriteLine(task.Result); }); Console.WriteLine("主線程結束"); Console.Read();
結果:
OnCompleted中的代碼會在任務執行完成之后執行!
另外task.ContinueWith()也是一個重要的方法:
Console.WriteLine("主線程開始"); Task<string> task = Task<string>.Run(() => { Thread.Sleep(2000); return Thread.CurrentThread.ManagedThreadId.ToString(); }); task.GetAwaiter().OnCompleted(() => { Console.WriteLine(task.Result); }); task.ContinueWith(m=>{Console.WriteLine("第一個任務結束啦!我是第二個任務");}); Console.WriteLine("主線程結束"); Console.Read();
結果:
ContinueWith()方法可以讓該后台線程繼續執行新的任務。