C# Task的使用---Task的啟動


.NET 4.0包含的新名稱空間System.Threading.Tasks,它包含的類抽象出了線程功能。任務表示應完成的某個單元的工作。這個單元的工作可以在單獨的線程中運行,也可以以同步的方式啟動一個任務,這需要等待主調線程。使用任務不僅可以獲得一個抽象層,還可以對底層線程進行許多控制。

啟動任務

    1)、使用TaskFactory類的實例,在其中把TaskMethod()方法傳遞給StartNew方法,就會立即啟動任務。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using System.Threading.Tasks;
   7: namespace TaskSamples
   8: {
   9:     class Program
  10:     {
  11:         static void TaskMethod()
  12:         {
  13:             Console.WriteLine("running in a task");
  14:             Console.WriteLine("Task id:{0}",Task.CurrentId);
  15:         }
  16:  
  17:         static void Main(string[] args)
  18:         {
  19:             //using task factory
  20:             TaskFactory tf = new TaskFactory();
  21:             Task t1 = tf.StartNew(TaskMethod);
  22:             Console.ReadKey();
  23:          }
  24:     }
  25: }

運行結果如下所示:

image

 

2)、使用Task類的Factory屬性,Task.Factory返回TaskFactory的默認實例。在其中把TaskMethod()方法傳遞給StartNew方法。這種方法實際和第一種方法是一樣的。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using System.Threading.Tasks;
   7: namespace TaskSamples
   8: {
   9:     class Program
  10:     {
  11:         static void TaskMethod()
  12:         {
  13:             Console.WriteLine("running in a task");
  14:             Console.WriteLine("Task id:{0}",Task.CurrentId);
  16:  
  17:         
  15:         }
  18:         static void Main(string[] args)
  19:         {
  20:            
  21:             //using the task factory via a task
  22:             Task t2 = Task.Factory.StartNew(TaskMethod);
  23:             Console.ReadKey();
  24:          }
  25:     }
  26: }

3)、使用Task類的實例,然后調用Start方法啟動任務。運行結果和上面兩種方式相同。在使用Task類時,除了調用Start()方法,還可以調用RunSynchronously()方法。這樣任務也會啟動,但在調用者的當前線程中,它正在運行的時候,調用者需要一直等待到該任務結束。默認情況下,任務是異步運行的。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using System.Threading.Tasks;
   7: namespace TaskSamples
   8: {
   9:     class Program
  10:     {
  11:         static void TaskMethod()
  12:         {
  13:             Console.WriteLine("running in a task");
  14:             Console.WriteLine("Task id:{0}",Task.CurrentId);
  15:         }   
  16:              
  17:         static void Main(string[] args)
  18:         {             
  19:             ////using Task constructor
  20:             Task t3 = new Task(TaskMethod);
  21:             t3.Start();
  22:             Console.ReadKey();
  23:          }
  24:     }
  25: }

使用Task類的構造函數和TaskFactory類的StartNew()方法時,都可以傳遞TaskCreationOptions枚舉中的值。設置LongRunning選項,可以通知任務調度器,該任務需要較長時間執行,這樣調度器更可能使用新線程。如果該任務應關聯到父任務上,而父任務取消了,則該任務也應取消,此時應設置AttachToParent選項。PerferFairness的值表示,調度器應提取出已在等待的第一個任務。如果一個任務在另一個任務內容創建,這就不是默認情況。如果任務使用了子任務創建了其他工作,子任務就優先於其他任務。它們不會排在線程池隊列中的最后。如果這些任務應以公平的方式與所有其他任務一起處理,就設置該選項為PerferFairness。

   1: Task t3 = new Task(TaskMethod,TaskCreationOptions.PreferFairness);
   2:           t3.Start();


免責聲明!

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



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