本文主要介紹帶有返回值的Task和Continuation Task
前一篇博客介紹了Task,主要是沒有返回值的Task。本文所介紹的帶有返回值的Task,返回值通過task.Result進行讀取。
class TaskFuture { public int Action() { Thread.Sleep(2000); return 1; } public int FutureDemo() { var task = Task.Factory.StartNew<int>(Action); ; return task.Result; } } class Program { static void Main(string[] args) { var stopwatch = Stopwatch.StartNew(); stopwatch.Start(); var result = new TaskFuture().FutureDemo(); Console.WriteLine(result); Console.WriteLine("Finished"); Console.Read(); } }
當訪問task.Result的時候有可能Task還沒有開始執行或者Task還沒有執行完畢,這個時候當前線程會被block,一直到task完成並返回result為止。類似於Task.Wait()。當調用Task.Wait()時,調用線程會被block直到Task完成為止。
有一點額外說明:如果在調用Task.Result的時候Task還沒有開始,這個Task有可能不會再啟用新的線程,而是直接在當前的線程運行(inline)。變成了串行。
上面的運行結果展示了上面所說的”block“
Continuation Task是指在某Task處於某種狀態的時候繼續執行其他Task的操作。
class ContinueTask { public int Action() { Console.WriteLine("in Action"); return 1; } public void Continue() { var task = Task.Factory.StartNew<int>(Action); var continueTask = task.ContinueWith<int>(t => { Console.WriteLine("in continue Task"); return 2; }); Console.WriteLine("The result of continie task is " + continueTask.Result); } } class Program { static void Main(string[] args) { var stopwatch = Stopwatch.StartNew(); stopwatch.Start(); new ContinueTask().Continue(); Console.WriteLine("Finished"); Console.Read(); } }
ContinueTask可以在多個Task並行執行的時候執行取消操作。詳情點擊。
ContinueWhenAll即多任務延續。是指在多個Task完成的時候繼續執行某一個Task。
class ContinueTask { public int Action1() { Console.WriteLine("in Action1"); return 1; } public int Action2() { Console.WriteLine("in Action2"); return 2; } public void Continue() { var task1 = Task.Factory.StartNew<int>(Action1); var task2 = Task.Factory.StartNew<int>(Action2); var continueTask = Task.Factory.ContinueWhenAll<int>(new Task[] { task1, task2 }, (tasks) => { Console.WriteLine("in Continue Task"); return task1.Result + task2.Result; }); Console.WriteLine("The result of continie task is " + continueTask.Result); } } class Program { static void Main(string[] args) { var stopwatch = Stopwatch.StartNew(); stopwatch.Start(); new ContinueTask().Continue(); Console.WriteLine("Finished"); Console.Read(); } }
上面的延續任務中還使用了task1和task2的result。