1、簡介html
.Net Framework 4.0新增了一個System.Threading.Tasks命名空間,它包含的類提供了任務的相關操做。使用任務不只能夠得到一個抽象層,還能對底層線程進行不少統一的控制操做。express
主要類:Task(任務),TaskFactory(任務工廠),TaskScheduler(任務調度)數組
2、Task類併發
1.app
Task 類的表示單個操做不返回一個值,一般以異步方式執行。 Task 對象是一個的中心思想 基於任務的異步模式 首次引入.NET Framework 4 中。 由於由執行工做 Task 對象一般以異步方式執行在線程池線程上而不是以同步方式在主應用程序線程,您可使用Status 屬性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 屬性,以肯定任務的狀態。 大多數狀況下,lambda 表達式用於指定的任務是執行的工做。異步
對於返回值的操做,您使用 Task<TResult> 類。async
2.使用Task類的構造函數。實例化Task對象時,任務不會當即運行,而是指定Created狀態。接着調用Task類的Start()方法來啓動任務。使用Task類時,除了調用Start()方法,還能夠調用RunSynchronously()方法。這樣,任務也會啓動,可是同時調用。默認狀況下,任務是異步運行的。函數
Task task = new Task(TaskMethod); task.Start();
ContinueWith即是一個更好的方式,一個任務完成時它能夠啓動另外一個任務。 post
除了單個等待任務,Task 還提供了兩個靜態方法:WaitAny和WaitAll,他們容許線程等待一個Task對象數組。ui
WaitAny方法會阻塞調用線程,知道數組中的任何一個Task對象完成,這個方法會返回一個索引值,指明完成的是哪個Task對象。若是發生超時,方法將返回-1。它能夠經過一個CancellationToken取消,會拋出一個OperationCanceledException。
WaitAll方法也會阻塞調用線程,知道數組中的全部Task對象都完成,若是所有完成就返回true,若是超時就返回false。固然它也能取消,一樣會拋出OperationCanceledException。
獲取當前任務的ID
//使用任務對象,獲取當前任務ID Console.WriteLine("ID:" + task.Id);
//在任務中,獲取當前任務ID Console.WriteLine(Task.CurrentId);
3、TaskFactory類 任務工廠
使用實例化的TaskFactory類,在其中把TaskMethod方法傳遞給StartNew()方法,就會當即啓動任務。
TaskFactory tf = new TaskFactory(); tf.StartNew(TaskMethod);
使用默認Factory對象
Task task = Task.Factory.StartNew(TaskMethod);
4、TaskScheduler類 任務調度
任務基礎結構是很靈活的,TaskScheduler對象功不可沒。
TaskScheduler對象負責執行調度的任務,同時向Visual Studio調試器公開任務信息,就像一座橋樑,讓咱們可以掌控本身的任務線程。
TaskScheduler有兩個派生類:thread pool task scheduler(線程池任務調度),和synchronization context task scheduler(同步上下文任務調度器)。默認狀況下,因此應用程序使用的都是線程池任務調度器,這個任務調度器將任務調度給線程池的工做者線程。能夠查詢TaskScheduler的靜態Default屬性來得到對默認任務調度器的一個引用。
同步上下文任務調度器一般用於桌面應用程序,Winfrom,WPF及Silverlight。這個任務調度器將多有任務都調度給應用程序的GUI線程,使全部任務代碼都能成功更新UI組建,好比按鈕、菜單項等。同步上下文任務調度器根本不使用線程池。一樣,能夠查詢TaskScheduler的靜態FromCurrentSynchronizationContext方法來得到對一個同步上下文任務調度器的引用。
獲取當前調取器及id
//獲取當前任務調度器,調度器的ID在多個任務中老是爲1 TaskScheduler scheduler = TaskScheduler.Current; if (scheduler != null) Console.WriteLine("scheduler:" + scheduler.Id);
獲取最大調度級別
TaskScheduler scheduler = TaskScheduler.Current; //獲取最大的併發級別,2147483647 Console.WriteLine(scheduler.MaximumConcurrencyLevel); //若是想獲取當前全部的任務集合或id,須要本身擴展處理
就像這樣建立類型:
1 //同步上下文任務調度 2 TaskScheduler m_syncContextTaskScheduler = 3 TaskScheduler.FromCurrentSynchronizationContext();
任務調度有不少的
更多:
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx