.NET4.0的Task Wait方法不會等待子Task完成


看標題呢,大家會糊塗,所謂的子Task,就是在一個Task中再創建一個Task,也就是嵌套Task。
Task是.NET4.0加入的,跟線程池ThreadPool的功能類似,用Task開啟新任務時,會從線程池中調用線程,而Thread每次實例化都會創建一個新的線程。
        創建Task的方法:
        1、直接實例化:必須手動去Start
             var task1 = new Task(() =>
             {
                  //TODO you code
              });
              task1.Start();
        2、工廠模式創建,直接執行
              var task2 = Task.Factory.StartNew(() =>
              {
                  //TODO you code
              });
         3、Run方法創建,直接執行
              var task2 = Task.Run(() =>
              {
                    //TODO you code
               });
       
         Task的生命周期:
          方法名                                            說明
         Created                         表示默認初始化任務,但是“工廠創建的”實例直接跳過。
         WaitingToRun                 這種狀態表示等待任務調度器分配線程給任務執行。
         RanToCompletion         任務執行完畢。
        
         Task的任務控制:
         方法名                                            說明
         Task.Wait              task1.Wait();就是等待任務執行(task1)完成,task1的狀態變為Completed。
         Task.WaitAll              待所有的任務都執行完成:
         Task.WaitAny              等待任何一個任務完成就繼續向下執行
         Task.ContinueWith      第一個Task完成后自動啟動下一個Task,實現Task的延續
         CancellationTokenSource通過cancellation的tokens來取消一個Task。

在主線程中等待后台線程執行完畢,可以使用Wait方法(會以同步的方式來執行)。不用Wait則會以異步的方式來執行。
如果在Task中再啟動一個子Task,主線程中用Wait方法等待完成,是主Task和子Task都完成后,再執行,還是主Task完成就執行呢?
下面以代碼測試:

        private void  ParentTask()
        {
            Task.Factory.StartNew(() =>
                {
                    SonTask();
                });
            Thread.Sleep(100);
            Console.WriteLine("主Task執行完畢!");
        }
         private void  SonTask()
         {
            Thread.Sleep(1000);
            Console.WriteLine("子Task執行完畢!");
         }
        [STAThread]
        static void Main()
        {
            Task parentTask = Task.Factory.StartNew(() => {
                ParentTask(); 
            });
           parentTask.Wait(); //等待parentTask完成
           Console.WriteLine("主進程執行");
           Console.ReadLine();
        }
     測試結果截圖:
      圖片

從測試結果看出,Wait方法會同步主Task,等待主Task完成,但不會等待子Task完成。

 


免責聲明!

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



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