Task參數類TaskCreationOptions、TaskContinuationOptions詳解


這兩個參數類用在創建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:只有在之前任務沒正常完成,才執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM