概述
? Task是微軟在.Net 4.0時代推出來的,Task看起來像一個Thread,實際上,它是在ThreadPool的基礎上進行的封裝,Task的控制和擴展性很強,在線程的延續、阻塞、取消、超時等方面遠勝于Thread和ThreadPool,所以一經問世,基本ThreadPool就被取代了.
Task用法舉例
static void Main(string[] args){string str = "當前時間是";for (int i = 0; i < 10; i++){Task.Run(() => ThreadFuc(str));}Console.ReadKey();}public static void ThreadFuc(string str){Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(1000);}
運行結果:
這里開了十個線程,task默認就是在線程池中創建線程,他會自行調度和回收不用的線程,減少每次重新創建線程的開銷,而且創建的是背景線程。
task有很多封裝好的API,比如:
①WaitAll:等待提供的所有 System.Threading.Tasks.Task 對象完成執行過程。
Task.WaitAll(t1,t2);//等待所有任務結束
② WaitAny:等待提供的任一 System.Threading.Tasks.Task 對象完成執行過程。
Task.WaitAny(t1,t2);
③ContinueWith:創建一個在目標 System.Threading.Tasks.Task 完成時異步執行的延續任務。
實例代碼:
static void Main(string[] args){string str = "當前時間是";Task t1 = Task.Run(() => ThreadFuc1(str));Task t2 = Task.Run(() => ThreadFuc2(str));Task.WaitAny(t1,t2);t1.ContinueWith(task =>{Console.WriteLine($"任務完成時的狀態:IsCanceled={task.IsCanceled}\tIsCompleted={task.IsCompleted}\tIsFaulted={task.IsFaulted}");});Task.WaitAll(t1,t2);//等待所有任務結束 Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Console.ReadKey();}public static void ThreadFuc1(string str){Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(1000);}public static void ThreadFuc2(string str){Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(2000);}
這里分別開啟了兩個線程t1、t2,在t1里面等待1秒,t2里面等待2秒,所以執行WaitAny時先等到ti完成,WaitAll時會等到t2完成.最終輸出結果如下:
④RunSynchronously:同步啟動,對當前的 System.Threading.Tasks.Task 同步運行 System.Threading.Tasks.TaskScheduler。(類似委托開啟線程,BeginInvoke是異步,而Invoke是同步)
用法:
Task t1 = new Task(() => ThreadFuc1(str));Task t2 = new Task(() => ThreadFuc2(str));t1.RunSynchronously();t2.RunSynchronously();
⑤Wait:等待 System.Threading.Tasks.Task 完成執行過程。
⑥Start:啟動 System.Threading.Tasks.Task,并將它安排到當前的 System.Threading.Tasks.TaskScheduler中執行;
帶返回值的使用方式:
static void Main(string[] args){string str = "當前時間是";Task<int> t1 = new Task<int>(() => ThreadFuc1(str));Task<int> t2 = new Task<int>(() => ThreadFuc2(str));t1.Start();t2.Start();Task.WaitAny(t1,t2);t1.ContinueWith(task =>{Console.WriteLine($"任務完成時的狀態:IsCanceled={task.IsCanceled}\tIsCompleted={task.IsCompleted}\tIsFaulted={task.IsFaulted}");});Task.WaitAll(t1,t2);//等待所有任務結束 int result1 = t2.Result;int result2 = t2.Result;Console.WriteLine($"result1值是{result1},result2值是{result2}");Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Console.ReadKey();}public static int ThreadFuc1(string str){Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(1000);return 1;}public static int ThreadFuc2(string str){Console.WriteLine($"線程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(2000);return 2;}
運行結果如下: