Task是一種基于任務(wù)的編程模型。它與thread的主要區(qū)別是,它更加方便對(duì)線程進(jìn)程調(diào)度和獲取線程的執(zhí)行結(jié)果娃肿。
Task類和Task類,前者接收的是Action委托類型珠十,后者接收的是Func委托類型料扰。
Task創(chuàng)建:
(1)直接創(chuàng)建
var task1 = new Task(() =>{System.Threading.Thread.Sleep(1000);});
task1.Start();
(2)工廠創(chuàng)建
Task.Factory.StartNew(() = {});
(3)Run運(yùn)行
Task.Run(() =>{});
注:
開(kāi)啟新任務(wù)的方法:Task.Run()或者Task.Factory.StartNew(),開(kāi)啟的是后臺(tái)線程
要在主線程中等待后臺(tái)線程執(zhí)行完畢焙蹭,可以使用Wait方法(會(huì)以同步的方式來(lái)執(zhí)行)晒杈。不用Wait則會(huì)以異步的方式來(lái)執(zhí)行。
thread和Task的區(qū)別孔厉,thread new多少個(gè)就會(huì)創(chuàng)建多少個(gè)線程拯钻,而task是利用線程池中的線程帖努。
Task其他方法:
Task.Wait(); 阻塞當(dāng)前線程
Task.WaitAll(); 阻賽當(dāng)前線程
Task.WaitAny(); 阻塞當(dāng)前線程直到有任意一個(gè)任務(wù)執(zhí)行完畢
Task.ContinueWith(task=>{});執(zhí)行完上一個(gè)任務(wù)后繼續(xù)執(zhí)行,并將上一個(gè)任務(wù)傳遞給下一個(gè)代碼塊