Parallel Programming-Task Result && Continuation Task

时间:2024-05-02 21:36:56

本文主要介绍带有返回值的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();
return ;
} 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 ;
} public void Continue()
{
var task = Task.Factory.StartNew<int>(Action);
var continueTask = task.ContinueWith<int>(t =>
{
Console.WriteLine("in continue Task");
return ;
});
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 ;
} public int Action2()
{
Console.WriteLine("in Action2");
return ;
}
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