CLR via C# 讀書筆記 3-5 .net framework4.0 新增類 Task(一種很好的異步模型)
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是一個聲明好的外部函數(shù), 當然我們也可以使用lambda來替代它
這幾句代碼聲明了一個Task 并且調用Start方法啟動他,然后使用Wait方法等待這個異步任務的完成
2.Task的優(yōu)勢
1.Task可以很方便的控制是使用線程池還是使用線程來執(zhí)行(也許以后還會增加更多的執(zhí)行模型)
2.Task<T> 允許輸入輸出強類型的參數(shù)
3.使用Task可以很方便的控制 例如:等待,取消 Task (個人覺得這個是最大的優(yōu)勢)
4.可以很方便的處理到Task中發(fā)生的未處理的異常
5.Task.ContinueWith方法可以很方便的安排Task之間的執(zhí)行順序(例如通過參數(shù)TaskCountinuationOptions參數(shù)來控制 在某任務A執(zhí)行完成,取消或者其他特定情況下,任務B立刻啟動接著執(zhí)行,以下代碼顯示了等待不同情況的執(zhí)行順序)
代碼
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當前的狀態(tài)(包括 新建,等待,運行,異常等)
7.可以自定義TaskScheduler,來控制Task的執(zhí)行, 目前已經(jīng)有很多成熟的Scheduler提供在網(wǎng)絡上(例如 IOTaskScheduler OrderedTaskScheduler 等..)

浙公網(wǎng)安備 33010602011771號