看标题呢,大家会糊涂,所谓的子Task,就是在一个Task中再创建一个Task,也就是嵌套Task。
Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程。
创建Task的方法:
1、直接实例化:必须手动去Start
创建Task的方法:
1、直接实例化:必须手动去Start
var task1 = new Task(() =>
{
//TODO you code
});
task1.Start();
2、工厂模式创建,直接执行
2、工厂模式创建,直接执行
var task2 = Task.Factory.StartNew(() =>
{
//TODO you code
});
3、Run方法创建,直接执行
3、Run方法创建,直接执行
var task2 = Task.Run(() =>
{
//TODO you code
});
Task的生命周期:
Task的生命周期:
方法名 说明
Created 表示默认初始化任务,但是“工厂创建的”实例直接跳过。
WaitingToRun 这种状态表示等待任务调度器分配线程给任务执行。
RanToCompletion 任务执行完毕。
Task的任务控制:
方法名 说明
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 SonTask()
在主线程中等待后台线程执行完毕,可以使用Wait方法(会以同步的方式来执行)。不用Wait则会以异步的方式来执行。
如果在Task中再启动一个子Task,主线程中用Wait方法等待完成,是主Task和子Task都完成后,再执行,还是主Task完成就执行呢?
下面以代码测试:
private void ParentTask()
{
Task.Factory.StartNew(() =>
Task.Factory.StartNew(() =>
{
SonTask();
});
Thread.Sleep(100);
Console.WriteLine("主Task执行完毕!");
}
{
Thread.Sleep(1000);
Console.WriteLine("子Task执行完毕!");
}
[STAThread]
[STAThread]
static void Main()
{
Task parentTask = Task.Factory.StartNew(() => {
ParentTask();
});
parentTask.Wait(); //等待parentTask完成
Console.WriteLine("主进程执行");
Console.ReadLine();
parentTask.Wait(); //等待parentTask完成
Console.WriteLine("主进程执行");
Console.ReadLine();
}
测试结果截图:
从测试结果看出,Wait方法会同步主Task,等待主Task完成,但不会等待子Task完成。
测试结果截图:

从测试结果看出,Wait方法会同步主Task,等待主Task完成,但不会等待子Task完成。