.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完成。

 

posted @ 2020-05-22 10:49  活着不容易  Views(1182)  Comments(0Edit  收藏  举报