C#并行庫Task類介紹
Task和ThreadPool的功能類似,可以用來創(chuàng)建一些輕量級的并行任務。對于將一個任務放進線程池
ThreadPool.QueueUserWorkItem(A);
這段代碼用Task來實現(xiàn)的話,方式如下:
Task.Create(A);
這兩端代碼的使用和實現(xiàn)的功能都十分相似。但和TheadPool相比,Task有著更多的功能,更加方便我們使用。
Task.WaitAll()該函數(shù)的功能是等待多個任務等待任務完成,這在線程同步時經(jīng)常需要用到。
假如我們要創(chuàng)建三個任務,并等待它們完成。這個功能用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屬性設置為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傳入構造函數(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ù)設置了為1,這樣的話,只有一個線程來處理Task,執(zhí)行這兩個Task總共花費的時間為4秒;而在使用默認manager時候,這兩個任務是并發(fā)執(zhí)行的,只需要兩秒即可執(zhí)行完成。
異常處理
當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);到此這篇關于C#并行庫Task類的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
c#創(chuàng)建windows服務(Windows Services)詳細步驟
這篇文章主要介紹了c#創(chuàng)建windows服務(Windows Services)詳細步驟,大家參考使用吧2013-12-12
.net使用Aspose.Words進行Word替換操作的實現(xiàn)代碼
之前在工作中,需要實現(xiàn)Word打印功能,并且插入圖片。當時采取的方式則是使用書簽進行操作。首先在word內插入書簽,完成后,存為模板。程序加載該模板,找到書簽,并在指定位置寫入文字即可2013-05-05

