Task 運用

創建Task任務的方法

            // 法一 
            var tf = new TaskFactory();
            var t_a = tf.StartNew(() => Console.Write("create a task"));

            // 法二
            Task.Factory.StartNew(() => Console.Write("create a task")); 

            // 法三
            Task.Run(() => Console.Write("create a task"));

            // 法四
            var t = new Task(() => Console.Write("create a task"));
            t.Start();

            // 集合用法
            List<Task> list = new List<Task>();
            list.Add(Task.Run(() => strResult = GetString("aaa")));
            list.Add(Task.Run(() => myInt = GetInt(0)));
            list.Add(Task.Run(() => GetVoid()));

帶返回值的Task

Task<int> task = new Task<int>(a => { return (int)a + 1; }, 1);
task.Start();
Console.WriteLine(task.Result);    //task.Result 獲取返回值

Taske的WaitAll()方法,主線程等待WaitAll()參數內的所有線程執行完,會卡住頁面,與WaitAll相近的方法還有 Wait(Int32) 和 Wait(TimeSpan) 方法阻止調用線程,WaitAny() 表示等待某個或多個Task執行完成

            DateTime startTime = DateTime.Now;     // Task開始時間
            List<Task> list = new List<Task>();
            list.Add(Task.Run(() => myInt = GetInt(10)));
            list.Add(Task.Run(() =>
            {
                Console.Write("事物開始!");  
                DateTime outTime = DateTime.Now.AddSeconds(20);   // 設置超時時間爲20S
                bool bls = true;
                while (!(list[0].IsCompleted))    // 判斷Task[0]是否完成
                { 
                    if (DateTime.Now > outTime)   // 判斷是否超時 
                        bls = false;
                }
                DateTime sTime = startTime;       // Task運行開始時間
                DateTime endTime = DateTime.Now;  // Task運行結速時間
                if (bls)      
                    Console.Write("所有Task成功任務已完成,提交事物!");
                else
                    Console.Write("所有Task任務失敗----超時----已結束,回滾事物!");

            }));
            // var a Task.Run(() => strResult = GetString("aaa"));
            // var b=Task.Run(() => strResult = GetString("bb"));
            // Task.WaitAll(a,b);  // 推薦用這種 
            Task.WaitAll(list.ToArray());

 

使用變量對Task方法結果賦值,保證頁面不卡ContinueWith()方法,同時取前Task的變量值來處理

            string strResult = "";
            int myInt = 0;
            // 集合用法    不推薦,更推存var tss = new Task(()=> strResult=GetString("bbb")這種寫法
            List<Task> list = new List<Task>();
            list.Add(Task.Run(() => strResult = GetString("aaa")));   // 給 strResult在Task中賦值
            list.Add(Task.Run(() => myInt = GetInt(0)));              // 給 myInt在Task中賦值
            list.Add(Task.Run(() => GetVoid()));
            list[2].ContinueWith(task =>         // ContinueWith()延續任務 指Task完成第一個任務再下延續任務
            {
                bool bls = true;
                Console.Write(strResult + myInt);  // 對變量strResult和myInt操作
                DateTime outTime = DateTime.Now.AddSeconds(5);        // 設置超時時間
                while (!list[0].IsCompleted || !list[1].IsCompleted)  //  判斷這兩個任務是否執行完?
                {
                    if (DateTime.Now > outTime)     // 判斷是否超時
                        bls = false;
                }
                if (bls)
                    Console.Write("方案成功執行,提交事物!");
                else
                    Console.Write("方案執行失敗,超時,回滾事物!");
            });

有反回值的Task,通過Result 屬性獲取Task的返回值

            Task<string> tasks = Task.Factory.StartNew<string>(() => {return GetString("ccc"); });
            string aaa = tasks.Result;
            
            Task<string> ts =new Task<string>(()=> {
                while (!tasks.IsCompleted)     // 判斷tasks是否執行完成
                { }
                return GetString("ccc") +"     "+ tasks.Result;  // 通過tasks.Result獲取tasks的返回值
            });
            ts.Start();
            string stsssssr = ts.Result;     // 通過ts.Result 獲取ts的返回值
            Console.Write(stsssssr);

使用單獨線程的任務

如果任務的代碼需要運行很長時間,就應該使用TaskCreationOptions.LongRunning告訴任務調度器創建一個新線程,而不是使用線程池中的線程。此時線程可以不由線程池管理。當線程來自線程池時,任務調度器可以決定等待已經運行的任務完成,然後使用這個線程,而不是在線程池中創建一新的線程。對於長時間運行的線程,任務調度器會立即知道等待他們完成不是明智做法。

            Task<string> tasks = Task.Factory.StartNew<string>(() => {return GetString("ccc"); }, TaskCreationOptions.LongRunning);
            string aaa = tasks.Result;
            
            Task<string> ts =new Task<string>(()=> {
                while (!tasks.IsCompleted)
                { }
                return GetString("ccc") +"     "+ tasks.Result;  // 通過tasks.Result獲取tasks的返回值
            }, TaskCreationOptions.LongRunning);
            ts.Start();
            string stsssssr = ts.Result;     // 通過ts.Result 獲取ts的返回值
            Console.Write(stsssssr);

 

 

 

 

 

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章