一、簡介
.Net Framework 4.0新增了一個System.Threading.Tasks命名空間,它包含的類提供了任務的相關操作。使用任務不僅可以獲得一個抽象層,還能對底層線程進行很多統一的控制操作。
主要類:Task(任務),TaskFactory(任務工廠),TaskScheduler(任務調度)
二、Task類
1.
Task 類的表示單個操作不返回一個值,通常以異步方式執行。 Task 對象是一個的中心思想 基於任務的異步模式 首次引入.NET Framework 4 中。 因為由執行工作 Task 對象通常以異步方式執行在線程池線程上而不是以同步方式在主應用程序線程,您可以使用Status 屬性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 屬性,以確定任務的狀態。 大多數情況下,lambda 表達式用於指定的任務是執行的工作。
對於返回值的操作,您使用 Task<TResult> 類。
2.使用Task類的構造函數。實例化Task對象時,任務不會立即運行,而是指定Created狀態。接着調用Task類的Start()方法來啟動任務。使用Task類時,除了調用Start()方法,還可以調用RunSynchronously()方法。這樣,任務也會啟動,但是同時調用。默認情況下,任務是異步運行的。
Task task = new Task(TaskMethod); task.Start();
ContinueWith便是一個更好的方式,一個任務完成時它可以啟動另一個任務。
除了單個等待任務,Task 還提供了兩個靜態方法:WaitAny和WaitAll,他們允許線程等待一個Task對象數組。
WaitAny方法會阻塞調用線程,知道數組中的任何一個Task對象完成,這個方法會返回一個索引值,指明完成的是哪一個Task對象。如果發生超時,方法將返回-1。它可以通過一個CancellationToken取消,會拋出一個OperationCanceledException。
WaitAll方法也會阻塞調用線程,知道數組中的所有Task對象都完成,如果全部完成就返回true,如果超時就返回false。當然它也能取消,同樣會拋出OperationCanceledException。
獲取當前任務的ID
//使用任務對象,獲取當前任務ID Console.WriteLine("ID:" + task.Id);
//在任務中,獲取當前任務ID Console.WriteLine(Task.CurrentId);
三、TaskFactory類 任務工廠
使用實例化的TaskFactory類,在其中把TaskMethod方法傳遞給StartNew()方法,就會立即啟動任務。
TaskFactory tf = new TaskFactory(); tf.StartNew(TaskMethod);
使用默認Factory對象
Task task = Task.Factory.StartNew(TaskMethod);
四、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