本文主要介紹帶有返回值的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。
