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

当访问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 ;
} 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 运行结果

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的更多相关文章

  1. Task.Result跟 Task.GetAwaiter.GetResult()相同吗?怎么选?

    前几天在用线程池执行一些任务时运到一种情形,就是回调方法中使用到了异步方法,但是回调方法貌似不支持async await的写法.这时候我应该如何处理呢?是使用Task.Result来获取返回结果,还是 ...

  2. Task Cancellation: Parallel Programming

    http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...

  3. 编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为

    建议82:Parallel简化但不等同于Task默认行为 建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用.也就是说,在运行Paralle ...

  4. 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用

    建议81:使用Parallel简化同步状态下Task的使用 在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主 ...

  5. .net core Task.Result Wait等造成502

    这两天公众号项目上线,刚开始项目运行没什么问题,但几天之后,访问量激增,服务器崩溃了,每次请求都返回502,一脸懵逼,无从下手,赶紧开日志里的BUG,拿出来一个个改,BUG都改完之后,没有明显的效果, ...

  6. 初步学习async/await,Task.GetAwaiter,Task.Result

    网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下. 首先以最简单的同步方法来开始如下 private static void Test( ...

  7. async await task.Result 卡死

    在如下代码中: public async Task<string> GetData() { return await DoWork(); } 在UI线程中调用 var data = Get ...

  8. async,await与task.wait()或task.Result的区别

    你是否曾经与我一样不理解async,await与task.wait()或者task.Result的区别? 接下来,一个Demo让你看出他们之间的区别. static void Main(string[ ...

  9. 一句 Task.Result 就死锁, 这代码还怎么写?

    一:背景 1. 讲故事 前些天把 .NET 高级调试 方面的文章索引到 github 的过程中,发现了一个有意思的评论,详见 文章,截图如下: 大概就是说在 Winform 的主线程下执行 Task. ...

随机推荐

  1. hdu 4414 Finding crosses【简单模拟】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4414 CSUST:点击打开链接 Finding crosses Time Limit: 2000/1000 ...

  2. php递归删除所有文件

    function del_file($dir) { if (@rmdir($dir)==false && is_dir($dir)) { if ($dp = opendir($dir) ...

  3. flex (html弹性布局)

    flex是什么? 任何容器都可以指定为flex布局: .box{ display: flex;  /* 行内元素可以使用:inline-flex,webket内核浏览器必须 -webkit-flex ...

  4. Mac idea maven 创建web项目

    这样项目就创建完成了.然后把Tomcat加入进去就可以跑通了.

  5. linux 4 -awk

    十一.  awk编程:     1.  变量:     在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&q ...

  6. LeetCode:位运算实现加法

    LeetCode:位运算实现加法 写在前面 位运算符 实现加法的思路 两个加数,比如5(101)和6(110),如何不用加法就能得出两者之和呢? 我们知道二进制计算中,如果使用异或将会产生无进位的两者 ...

  7. Java编程思想(第4版) 中文清晰PDF完整版

    Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区  作者:Linux [字体:大 中 小]     <Java编程思想>这本书赢得了全 ...

  8. 视图的创建与使用 Sql Server View

    创建教材的三个数据表Student.Course及SC. create database S_T Use S_T CREATE TABLE Student (Sno CHAR(9), Sname CH ...

  9. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  10. 【leetcode刷题笔记】Longest Valid Parentheses

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...