1、線程自旋:在阻塞線程的時候為了等待解鎖(訪問臨界資源)(Sleep)。
2、上下文切換:將處理器當前線程的狀態保存到操作系統內部的線程對象中,然后再挑出一個就緒的線程,把上下文信息傳遞給處理器,然后執行這個線程。
要盡量避免上述兩種情況。
using System.Threading.Tasks; namespace ShouldCode { public sealed class ShouldContinueNotWait { public Task ShouldContinue() { var task = Task.Run(() => { System.Console.WriteLine("任務1完成!"); }); //盡量使用 ContinueWith 處理后續任務 task.ContinueWith(t => System.Console.WriteLine("任務1后續任務1完成!")) .ContinueWith(t => System.Console.WriteLine("任務1后續任務1的后續任務完成!"));
//耗時短的后續任務應該使用同一個線程避免可能發生的上下文切換 task.ContinueWith(t => System.Console.WriteLine("任務1后續任務2完成!"), TaskContinuationOptions.ExecuteSynchronously); return task; } public Task NotWait() { var task = Task.Run(() => { System.Console.WriteLine("任務1完成!"); }); task.Wait(); System.Console.WriteLine("任務1后續任務完成!"); return task; } public async Task ShouldAwait() { var task = Task.Run(() => { System.Console.WriteLine("任務1完成!"); }); await task; //此語法糖基於 continuewith 實現,和 ShouldContinue 相同 System.Console.WriteLine("任務1后續任務完成!"); } public async Task NotWaitAsync() { var task = Task.Run(() => { System.Console.WriteLine("任務1完成!"); }); //異步方法中不要同步等待 //task.Wait();盡量不要使用。 task.Wait(); await Task.Run(() => { System.Console.WriteLine("任務2完成!"); }); } } }