1. 程式人生 > >3 Task中的一些列舉 建立時候的、continue時候的

3 Task中的一些列舉 建立時候的、continue時候的

建立時常用的列舉:

None、PreferFairness、LongRunning、AttacthedToParent、DenyChildAttach、HideScheduler

AttacthedToParent:

背景程式碼如下

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            
//建立了一個執行緒1 Task t = Task.Factory.StartNew(() => { Console.WriteLine("thread 1"); Task t1 = new Task(() =>{ Thread.Sleep(100); Console.WriteLine( "task 11"); }); Task t2
= new Task(() => { Console.WriteLine("task 12"); }); t1.Start(); t2.Start(); //下面continue中的新的執行緒 肯定是在 執行緒1之後 //但是線上程1裡面又另外啟用了2 個執行緒 continue中的執行緒就未必在這兩個執行緒執行完之後執行 }).ContinueWith(_t=> { Console.WriteLine("thread 2
"); }); Console.ReadKey(); } } }

thread 1
thread 2
task 12
task 11

這時 如果要continue中啟用的執行緒在task t內部所有執行緒執行完畢之後再執行可以使用 AttacthedToParent列舉

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //建立了一個執行緒1
            Task t = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("thread 1");
                Task t1 = new Task(() =>
                {
                    Thread.Sleep(100);
                    Console.WriteLine("task 11");

                }, TaskCreationOptions.AttachedToParent);
                Task t2 = new Task(() => { Console.WriteLine("task 12"); }, TaskCreationOptions.AttachedToParent);
                t1.Start();
                t2.Start();
                //下面continue中的新的執行緒 肯定是在 執行緒1之後
                //但是線上程1裡面又另外啟用了2 個執行緒 continue中的執行緒就未必在這兩個執行緒執行完之後執行
            }).ContinueWith(_t =>
            {
                Console.WriteLine("thread 2");
            });
            //如果不允許t1 和 t2附加到t上面
            //}, TaskCreationOptions.DenyChildAttach).ContinueWith(_t =>
            //{
            //    Console.WriteLine("thread 2");
            //});
            Console.ReadKey();
        }
    }
}

執行結果: 

thread 1
task 12
task 11
thread 2

AttacthedToParent的效果相當於t.WaitAll(t1,t2)

LongRunning :長時間執行的任務 ,如果你明知道是長時間執行的,建議你使用此列舉。因為這個列舉建立的執行緒是一個新建的Thread 而不是執行緒池的執行緒。為什麼要這麼搞呢,因為如果你不這麼搞,使用的是執行緒池的執行緒,執行緒池的執行緒長期少一個的話,執行緒池會再建立一個執行緒,當你這個執行緒執行完畢還給執行緒池的時候,執行緒池的執行緒就比原來的執行緒池多一個,導致執行緒池執行緒過多,導致cpu切換時間變長等問題。

PreferFairness 讓各個執行緒看起來公平點,會將task扔到ThreadPool的全域性佇列中,讓workthread進行爭搶,不這樣搞預設會放進thread的一個本地佇列中。