2、Task 使用 ContinueWith 而不要使用 Wait


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完成!"); }); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM