本文主要介绍带有返回值的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 执行流程

Parallel Programming-Task Result && Continuation Task

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

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

1.3 运行结果

Parallel Programming-Task Result && Continuation Task

上面的运行结果展示了上面所说的”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 运行结果

Parallel Programming-Task Result && Continuation Task

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 运行结果

Parallel Programming-Task Result && Continuation Task

转载于:https://www.cnblogs.com/Brake/p/Parallel_Programming_Task_Result_And_Continuation_Task.html

相关文章: