首页 > 其他 > 详细

TaskCreationOptions、TaskContinuationOptions详解

时间:2020-05-29 01:27:31      阅读:119      评论:0      收藏:0      [点我收藏+]

这两个参数类用在创建Task和ContinueWith()中

TaskCreationOptions:

TaskCreationOptions.AttachedToParent:子任务执行完后,父任务才会继续执行。否则父任务不会等子任务执行完成

            Task t = new Task(() =>
            {
                var t1 = new Task(() =>
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("t1 end");
                }, TaskCreationOptions.AttachedToParent);
                var t2 = new Task(() =>
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("t2 end");
                }, TaskCreationOptions.AttachedToParent);
                t1.Start();
                t2.Start();
            });
            t.Start();
            t.Wait();
            Console.WriteLine("主线程end");
            //输出结果 t1 end、t2 end、主线程end

TaskCreationOptions.DenyChildAttach:不允许子任务附加到当前任务

            Task t = new Task(() =>
            {
                var t1 = new Task(() =>
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("t1 end");
                }, TaskCreationOptions.AttachedToParent);
                var t2 = new Task(() =>
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("t2 end");
                }, TaskCreationOptions.AttachedToParent);
                t1.Start();
                t2.Start();
            }, TaskCreationOptions.DenyChildAttach);
            t.Start();
            t.Wait();
            Console.WriteLine("主线程end");
            //输出结果 主线程end、t1 end、t2 end

TaskCreationOptions.HideScheduler:子任务默认不使用父任务的Scheduler,而是使用默认的

TaskCreationOptions.LongRunning:如果你知道任务是长时间运行,就使用此选项,不使用TreadPool

TaskCreationOptions.PreferFairness:队列?

 

TaskContinuationOptions:

TaskCreationOptions中有的属性它都有,就不介绍了

TaskContinuationOptions.LazyCancellation:cancell延时执行,默认情况下在执行ContinueWith方法中就判断cancell状态。加上此选项后,在Action中判断cancell状态

var tokenSource = new CancellationTokenSource();
            tokenSource.Cancel();
            Task t1 = new Task(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("t1 end");
            });
            var t2 = t1.ContinueWith((t) =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("t2 end");
            }, tokenSource.Token,TaskContinuationOptions.LazyCancellation,TaskScheduler.Current);
            var t3 = t2.ContinueWith((t) =>
            {
                Console.WriteLine("t3 end");
            });

            t1.Start();
            //执行结果:t1 end、t3 end
            //如果不加TaskContinuationOptions.LazyCancellation,执行结果是:t3 end、t1 end

 

TaskContinuationOptions.ExecuteSynchronously:延续任务使用之前任务的线程执行

 

//TaskContinuationOptions.OnlyOnCanceled:只有在之前任务取消,才执行
//TaskContinuationOptions.OnlyOnFaulted:只有在之前任务异常,才执行
//TaskContinuationOptions.OnlyOnRanToCompletion:只有在之前任务正常完成,才执行

//TaskContinuationOptions.NotOnCanceled:只有在之前任务没取消,才执行
//TaskContinuationOptions.NotOnFaulted:只有在之前任务没异常,才执行
//TaskContinuationOptions.NotOnRanToCompletion:只有在之前任务没正常完成,才执行

 

TaskCreationOptions、TaskContinuationOptions详解

原文:https://www.cnblogs.com/fanfan-90/p/12984769.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!