本文主要介绍带有返回值的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。
新闻热点
疑难解答