首页 > 学院 > 开发设计 > 正文

ParallelProgramming-TaskResult&&ContinuationTask

2019-11-14 13:47:55
字体:
来源:转载
供稿:网友

本文主要介绍带有返回值的Task和Continuation Task

  1. 带返回值的Task
  2. Continuation Task
  3. ContinueWhenAll即多任务延续

一、带返回值的Task

1.1代码演示

前一篇博客介绍了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();        }    }

1.2 执行流程

当访问task.Result的时候有可能Task还没有开始执行或者Task还没有执行完毕,这个时候当前线程会被block,一直到task完成并返回result为止。类似于Task.Wait()。当调用Task.Wait()时,调用线程会被block直到Task完成为止。

有一点额外说明:如果在调用Task.Result的时候Task还没有开始,这个Task有可能不会再启用新的线程,而是直接在当前的线程运行(inline)。变成了串行。

1.3 运行结果

上面的运行结果展示了上面所说的”block“

 二、Continuation Task

Continuation Task是指在某Task处于某种状态的时候继续执行其他Task的操作。

2.1代码演示

  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();        }    }

2.2 运行结果

2.3 实际应用

ContinueTask可以在多个Task并行执行的时候执行取消操作。详情点击。

三、 Task.Factory.ContinueWhenAll

ContinueWhenAll即多任务延续。是指在多个Task完成的时候继续执行某一个Task。

3.1代码演示

  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。

3.2 运行结果


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表