Task
Task的背后的實現也是使用了線程池線程,但它的性能優於ThreadPoll,因為它使用的不是線程池的全局隊列,而是使用的本地隊列,使線程之間的資源競爭減少。同時Task提供了豐富的API來管理線程、控制。但是相對前面的兩種耗內存,Task依賴於CPU對於多核的CPU性能遠超前兩者,單核的CPU三者的性能沒什么差別。
創建一個task也有3種方式來操作,Task.Factory.StartNew()
、Task run()
、new Task()
, 前面2種是一樣的,不需要用start
來開始執行,后面一種需要start
來執行的。
Task t = Task.Run(() => { //下面 的代碼線性運行 this.Invoke((EventHandler)(delegate { } }
Task t = Task.Factory.StartNew( () => { // Just loop. int ctr = 0; for (ctr = 0; ctr <= 1000000; ctr++) {} Console.WriteLine("Finished {0} loop iterations", ctr); } );
var task1 = new Task(() => { Console.WriteLine("Task 1 Begin"); System.Threading.Thread.Sleep(2000); Console.WriteLine("Task 1 Finish"); }); task1.Start();
取消任務的話,需要一個CancellationTokenSource
的token
來取消即可
var tokenSource = new CancellationTokenSource(); var token = tokenSource.Token; var task = Task.Factory.StartNew(() => { for (var i = 0; i < 1000; i++) { System.Threading.Thread.Sleep(1000); if (token.IsCancellationRequested) { Console.WriteLine("Abort mission success!"); return; } } }, token); tokenSource.Cancel();