Task 是在.net framework 4.0中提供的新功能
主要用於非同步作業的控制
在很多時候他比Thread和ThreadPool提供更為強大的功能,並且更方便使用
1.demo
以下代碼是使用Task的一個demo
代碼
// Create a Task (it does not start running now)
Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000000000);
// You can start the task sometime later
t.Start();
// Optionally, you can explicitly wait for the task to complete
t.Wait(); // FYI: Overloads exist accepting timeout/CancellationToken
// You can get the result (the Result property internally calls Wait)
Console.WriteLine("The Sum is: " + t.Result); // An Int32 value
Sum是一個聲明好的外部函數, 當然我們也可以使用lambda來替代它
這幾句代碼聲明了一個Task 並且調用Start方法啟動他,然後使用Wait方法等待這個非同步任務的完成
2.Task的優勢
1.Task可以很方便的控制是使用線程池還是使用線程來執行(也許以後還會增加更多的執行模型)
2.Task<T> 允許輸入輸出強型別的參數
3.使用Task可以很方便的控制 例如:等待,取消 Task (個人覺得這個是最大的優勢)
4.可以很方便的處理到Task中發生的未處理的異常
5.Task.ContinueWith方法可以很方便的安排Task之間的執行順序(例如通過參數TaskCountinuationOptions參數來控制 在某任務A執行完成,取消或者其他特定情況下,任務B立刻啟動接著執行,以下代碼顯示了等待不同情況的執行順序)
代碼
Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 100000000);
t.Start();
t.ContinueWith(task => Console.WriteLine("The sum is: " + task.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);//only completion
t.ContinueWith(task => Console.WriteLine("Sum threw: " + task.Exception),
TaskContinuationOptions.OnlyOnFaulted);//only exception
t.ContinueWith(task => Console.WriteLine("Sum was canceled"),
TaskContinuationOptions.OnlyOnCanceled);//only cencel
6.可以通過Task.Status 很方便的查詢到一個Task當前的狀態(包括 建立,等待,運行,異常等)
7.可以自訂TaskScheduler,來控制Task的執行, 目前已經有很多成熟的Scheduler提供在網路上(例如 IOTaskScheduler OrderedTaskScheduler 等..)