什么是Task


什么是Task

Task是.Net4.0新增用來處理異步編程的,叫做基於“任務編程模型”,任務其實是架構在線程之上的,具體操作的時候還是由線程去執行的,任務的管控有點類似於線程池,程序中開10個Task,不一定對應的要開10個線程,他們並不是一一對應的關系。

  1. 創建Task 
    創建Task有兩種方式,一種是直接實例化,另一種是使用任務工廠生成。
Task<int> ts = new Task<int>(TaskTest, 100); public static int TaskTest(object state) { int data = (int)state; int sum = 0; for (int i = 0; i < data; i++) { sum++; } return sum; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這里第一個參數為方法委托,可以直接傳入要執行的方法名,值得注意的是這個方法的參數類型為object,若改為int,會編譯不過,具體可去查看Task的構造函數的參數類型。 
當然也可以用Lamda表達式

Task<int> ts = new Task<int>((state) => { int data = (int)state; int sum = 0; for (int i = 0; i < data; i++) { sum++; } return sum; },10); ts.Start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

實例化的Task對象,必須用Start方法啟動。 
第二種用任務工廠直接創建的無需用Start方法啟動執行,創建后就會執行

 Task<int> task = Task.Factory.StartNew<int>( (state) => { int data = (int)state; int sum = 0; for (int i = 0; i < data; i++) { sum++; } return sum; }, 10);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Task與Task的區別是,Task是沒有返回值的,而Task是有返回值的,且返回值類型為T,對於沒有返回值的Task,可用Wait方法等待其執行完成,有返回值得直接用task.Result即可,記住,在等待任務執行完的過程中,是會阻塞主線程的,這也就是async和await的的作用體現了。 
若有多個任務,比如任務1和任務2,且任務2要在任務1執行完畢后立刻啟動執行,下面就來介紹Task.ContinueWith

static void Main(string[] args) { Task<int> ts1 = new Task<int>(() => { return 100; }); ts1.Start(); var re = ts1.ContinueWith<int>((task) => { return task.Result + 200; }); Console.WriteLine("執行結果:"+re.Result); Console.ReadLine(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這里寫圖片描述 
ContinueWith 需將ts1作為參數進行傳遞,即總可以把前面的一個Task用ContinueWith傳遞給下一個要執行的Task,下面是任務工廠的寫法

Task.Factory.StartNew<int>(() => { return 100; }).ContinueWith<int>(ts => { return ts.Result + 200; }).ContinueWith(task => { Console.WriteLine("執行結果:" + task.Result); }); Console.ReadLine();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Mark下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM