示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TaskTest3
{
class Program
{
static void Main(string[] args)
{
//任务支持父/子关系
Task<Int32[]> parent = new Task<Int32[]>(() =>
{
// 创建一个数组来存储结果
var results = new Int32[3];
// 这个任务创建并启动3个子任务
// 不指定创建选项,默认创建的是顶级任务(即,与创建它们的任务无关)
// AttachedToParent将一个Task和创建它的Task关联,结果是除非所有子任务(以及子任务的子任务)
// 结束运行,否则创建任务(父任务)不认为已经结束。
// 调用ContinueWith方法创建Task时,可指定TaskCreationOptions.AttachedToParent标志将延续任务指定成子任务。
new Task(() => results[0] = Sum(10000), TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[1] = Sum(20000), TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[2] = Sum(30000), TaskCreationOptions.AttachedToParent).Start();
// 返回对数组的引用(即使数组元素可能还没有初始化)
return results;
});
// 父任务及其子任务运行完成后,用一个延续任务显示结果
var cwt = parent.ContinueWith(parentTask => Array.ForEach(parentTask.Result, Console.WriteLine));
// 启动父任务,便于它启动它的子任务
parent.Start();
Console.ReadLine();
}
private static Int32 Sum(Int32 n)
{
Int32 sum = 0;
for (; n > 0; n--)
checked { sum += n; }
return sum;
}
}
}
运行测试