Parallel Programming-Task Result && Continuation Task
本文主要介绍带有返回值的Task和Continuation Task
- 带返回值的Task
- Continuation Task
- 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的更多相关文章
- Task.Result跟 Task.GetAwaiter.GetResult()相同吗?怎么选?
前几天在用线程池执行一些任务时运到一种情形,就是回调方法中使用到了异步方法,但是回调方法貌似不支持async await的写法.这时候我应该如何处理呢?是使用Task.Result来获取返回结果,还是 ...
- Task Cancellation: Parallel Programming
http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...
- 编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为
建议82:Parallel简化但不等同于Task默认行为 建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用.也就是说,在运行Paralle ...
- 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用
建议81:使用Parallel简化同步状态下Task的使用 在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主 ...
- .net core Task.Result Wait等造成502
这两天公众号项目上线,刚开始项目运行没什么问题,但几天之后,访问量激增,服务器崩溃了,每次请求都返回502,一脸懵逼,无从下手,赶紧开日志里的BUG,拿出来一个个改,BUG都改完之后,没有明显的效果, ...
- 初步学习async/await,Task.GetAwaiter,Task.Result
网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下. 首先以最简单的同步方法来开始如下 private static void Test( ...
- async await task.Result 卡死
在如下代码中: public async Task<string> GetData() { return await DoWork(); } 在UI线程中调用 var data = Get ...
- async,await与task.wait()或task.Result的区别
你是否曾经与我一样不理解async,await与task.wait()或者task.Result的区别? 接下来,一个Demo让你看出他们之间的区别. static void Main(string[ ...
- 一句 Task.Result 就死锁, 这代码还怎么写?
一:背景 1. 讲故事 前些天把 .NET 高级调试 方面的文章索引到 github 的过程中,发现了一个有意思的评论,详见 文章,截图如下: 大概就是说在 Winform 的主线程下执行 Task. ...
随机推荐
- hdu 4414 Finding crosses【简单模拟】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4414 CSUST:点击打开链接 Finding crosses Time Limit: 2000/1000 ...
- php递归删除所有文件
function del_file($dir) { if (@rmdir($dir)==false && is_dir($dir)) { if ($dp = opendir($dir) ...
- flex (html弹性布局)
flex是什么? 任何容器都可以指定为flex布局: .box{ display: flex; /* 行内元素可以使用:inline-flex,webket内核浏览器必须 -webkit-flex ...
- Mac idea maven 创建web项目
这样项目就创建完成了.然后把Tomcat加入进去就可以跑通了.
- linux 4 -awk
十一. awk编程: 1. 变量: 在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&q ...
- LeetCode:位运算实现加法
LeetCode:位运算实现加法 写在前面 位运算符 实现加法的思路 两个加数,比如5(101)和6(110),如何不用加法就能得出两者之和呢? 我们知道二进制计算中,如果使用异或将会产生无进位的两者 ...
- Java编程思想(第4版) 中文清晰PDF完整版
Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区 作者:Linux [字体:大 中 小] <Java编程思想>这本书赢得了全 ...
- 视图的创建与使用 Sql Server View
创建教材的三个数据表Student.Course及SC. create database S_T Use S_T CREATE TABLE Student (Sno CHAR(9), Sname CH ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- 【leetcode刷题笔记】Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...