Task——任务可以启动子任务

作者:追风剑情 发布于:2017-10-13 21:22 分类:C#

示例

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;
        }
    }
}

运行测试

111111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号