C#并行庫Task類介紹
Task和ThreadPool的功能類似,可以用來創(chuàng)建一些輕量級的并行任務(wù)。對于將一個任務(wù)放進線程池
ThreadPool.QueueUserWorkItem(A);
這段代碼用Task來實現(xiàn)的話,方式如下:
Task.Create(A);
這兩端代碼的使用和實現(xiàn)的功能都十分相似。但和TheadPool相比,Task有著更多的功能,更加方便我們使用。
Task.WaitAll()該函數(shù)的功能是等待多個任務(wù)等待任務(wù)完成,這在線程同步時經(jīng)常需要用到。
假如我們要創(chuàng)建三個任務(wù),并等待它們完成。這個功能用TheadPool實現(xiàn)如下:
using (ManualResetEvent mre1 = new ManualResetEvent(false)) using (ManualResetEvent mre2 = new ManualResetEvent(false)) using (ManualResetEvent mre3 = new ManualResetEvent(false)) { ThreadPool.QueueUserWorkItem(delegate { A(); mre1.Set(); }); ThreadPool.QueueUserWorkItem(delegate { B(); mre2.Set(); }); ThreadPool.QueueUserWorkItem(delegate { C(); mre3.Set(); }); WaitHandle.WaitAll(new WaitHandle[] { mre1, mre2, mre3 }); }
用Task類實現(xiàn)起來就相對簡單多了:
Task t1 = Task.Create(delegate { A(); }); Task t2 = Task.Create(delegate { B(); }); Task t3 = Task.Create(delegate { C(); }); t1.Wait(); t2.Wait(); t3.Wait();
或者我們還可以這么寫:
Task t1 = Task.Create(delegate { A(); }); Task t2 = Task.Create(delegate { B(); }); Task t3 = Task.Create(delegate { C(); }); Task.WaitAll(t1, t2, t3);
Task.Cancel和Task.CancelAndWait這個是一個成員函數(shù),用于取消已經(jīng)創(chuàng)建的Task,如果該Task正在執(zhí)行中,該函數(shù)并不終止Task的執(zhí)行,只是將IsCanceled屬性設(shè)置為true。
Task.Cancel和Task.CancelAndWait的區(qū)別在于:Task.CancelAndWait除了取消Task外,還將等待該Task執(zhí)行完成(如果該Task在執(zhí)行中)。Task.ContinueWith該成員函數(shù)的作用是在執(zhí)行完Task后,再執(zhí)行一個后續(xù)操作。這也是一個比較有用的功能,由于比較簡單,就不介紹了。
除了上述介紹的幾個方法外,Task還有一些比較有用的屬性和方法,也非常簡單,直接參看其說明文檔即可。
TaskManager和TaskManagerPolicy
這兩個類主要是對Task的策略進行管理,主要管理的屬性包括:最少處理Task的處理器個數(shù)、理想處理Task的處理器個數(shù)、理想的處理線程數(shù)及優(yōu)先級幾個屬性。
在Task中使用TaskManager非常簡單,只要在創(chuàng)建Task時將manager傳入構(gòu)造函數(shù)中即可。如下例所示:
var manager = new TaskManager(new TaskManagerPolicy(1, 1,1)); var t1 = Task.Create(x => Thread.Sleep(2000), manager); var t2 = Task.Create(x => Thread.Sleep(2000), manager); var start = DateTime.Now; Task.WaitAll(t1, t2); var end = DateTime.Now; Console.WriteLine(end-start);
在這里我將處理線程個數(shù)設(shè)置了為1,這樣的話,只有一個線程來處理Task,執(zhí)行這兩個Task總共花費的時間為4秒;而在使用默認(rèn)manager時候,這兩個任務(wù)是并發(fā)執(zhí)行的,只需要兩秒即可執(zhí)行完成。
異常處理
當(dāng)Task在執(zhí)行過程中發(fā)生異常時,該異常會在Wait或WaitAll函數(shù)中重新throw??梢酝ㄟ^Task的Exception屬性來獲取發(fā)生的異常。
var t1 = Task.Create(x => { throw new Exception("t1 error occor"); }); var t2 = Task.Create(x => { throw new Exception("t2 error occor"); }); try { Task.WaitAll(t1, t2); } catch(Exception) { Console.WriteLine(t1.Exception.InnerException.Message); Console.WriteLine(t2.Exception.InnerException.Message); }
另外,順帶簡單的介紹一下Future類,這個類的功能和用法和Task非常相似,完全可以看做一個帶返回值的Task。示例如下:
var f1 = Future.Create(() => 3); f1.Wait(); Console.WriteLine(f1.Value);
到此這篇關(guān)于C#并行庫Task類的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#控制Excel Sheet使其自適應(yīng)頁寬與列寬的方法
這篇文章主要介紹了C#控制Excel Sheet使其自適應(yīng)頁寬與列寬的方法,涉及C#操作Excel的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06C#使用Fleck實現(xiàn)創(chuàng)建WebSocket服務(wù)器
這篇文章主要為大家詳細(xì)介紹了C#如何使用Fleck實現(xiàn)創(chuàng)建WebSocket服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01