看標題呢,大家會糊塗,所謂的子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完成。