.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: }
運行結果如下所示:
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();