使用TPL取回Task中的运行结果的三种方式
概念:TPL( Task Parallel Library) 任务并行库
使用Task类执行多线程操作要比直接使用自己手工创建Thread效率高很多。
默认情况下,TPL使用线程池中的线程执行Task,但是工作结束之后,调用者线程怎么取回执行线程的工作结果呢?
这里有三种方法:
1.使用经典的线程同步手段:
可以使用线程同步对象。比如ManualResetEvent
在任务方法中设置ManualResetEvent状态为Signaled
调用者示例代码:
示例代码:
/// <summary>
/// 用于保存处理结果的共享资源
/// </summary>
private static long result = ;
/// <summary>
/// 用于通知启动任务的线程处理工作已完成
/// </summary>
static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Action<object> taskMethod = (end) =>
{
long sum = ;
for (int i = ; i < (int) end; i++)
sum += i;
//保存处理结果(使用Interlocked实现原子操作,无需加锁)
Interlocked.Exchange(ref result, sum);
//通知调用者,工作已经完成,可以取回结果了
mre.Set();
};
//启动异步任务
Task tsk = new Task(taskMethod,);
tsk.Start();
//等待并行处理的完成已取回结果
mre.WaitOne();
Console.WriteLine("程序运行结果为{0}",Program.result);
Console.ReadKey();
}
这种方法混杂了TPL与传统多线程开发方式,不推荐使用
2.使用Task<T>,Result属性
示例代码:
static void Main(string[] args)
{
Func<object, long> del = (end) =>
{
long sum = ;
for (int i = ; i < (int) end; i++)
sum += i;
return sum;
};
Task<long> tsk = new Task<long>(del,);
tsk.Start();
Console.WriteLine("程序运行结果为{0}",tsk.Result);
Console.ReadKey();
}
这种编程方式代码简洁,开发中可用,但是调用者线程必须阻塞等待任务结束。不适合在服务端应用中使用
3.基于回调模式的结果取回
TPL中有一个ContinueWith()方法,可用于创建前赴后继的工作任务
这里调用者线程不是阻塞等待的。适合在服务端应用程序中使用。
示例代码
static void Main(string[] args)
{
Func<object, long> ProcessData = (end) =>
{
long sum = ;
for (int i = ; i < (int)end; i++)
{
sum += i;
throw new DivideByZeroException();
}
return sum;
};
//用于取回处理结果的函数
Action<Task<long>> GetResult = (finishedTask) =>
{
//依据任务状态,决定后继处理工作
if (finishedTask.IsFaulted)
Console.WriteLine("任务在执行时发生异常:{0}", finishedTask.Exception);
else
Console.Write("程序运行结果为{0}", finishedTask.Result);
}; //创建并行处理数据的任务对象
Task<long> tskProcess = new Task<long>(ProcessData, ); //当数据处理结束时,自动启动下一个工作任务,取回上一任务的处理结果
Task tskGetResult = tskProcess.ContinueWith(GetResult); //开始并行处理数据……
tskProcess.Start(); Console.ReadKey();
}
使用TPL取回Task中的运行结果的三种方式的更多相关文章
- 在Tomcat中部署web项目的三种方式
搬瓦工搭建SS教程 SSR免费节点:http://www.xiaokeli.me 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Man ...
- Tomcat中部署web应用的三种方式
Tomcat中部署web应用的三种方式(静态部署) 第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...
- spring中创建bean对象的三种方式以及作用范围
时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...
- Linux中设置服务自启动的三种方式
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ...
- [转]Linux中设置服务自启动的三种方式
from:http://www.cnblogs.com/nerxious/archive/2013/01/18/2866548.html 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统 ...
- Linux中设置服务自启动的三种方式,ln -s 建立启动软连接
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务(http://www.0830120.com) 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立 ...
- (转)Linux中设置服务自启动的三种方式
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ...
- 【转发】Linux中设置服务自启动的三种方式
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ...
- Java中 实现多线程成的三种方式(继承,实现,匿名内部类)
---------------------------------------------------------------------------------------------------- ...
随机推荐
- Python之随机选择 random
随机选择:random import random # 从一个序列中随机的抽取一个元素 values=[1,2,3,4,56] # 指定取出N个不同元素 print(random.sample(val ...
- number框
因为系统的number框无法设置样式,所以休息无聊时写了一个简单的模拟number框的插件,效果不是很完善,有一些功能可能没注意到 // 简单的模拟number框插件 // 布局: // <di ...
- php yield关键字以及协程的实现
php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还 ...
- 解决 Failed to load class "org.slf4j.impl.StaticLoggerBinder"
我们在使用日志记录网站或者应用时,有时候启动会出现这个告警: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&q ...
- firefox浏览器强制取消自动更新
问题:Firefox浏览器,在浏览器的设置中已经设置了取消自动升级,实际退出Firefox浏览器重新启动浏览器后还是会升级到最新版本.影响:Firefox浏览器不同的版本的插件的支持兼容不一样,如果需 ...
- vue 如何读取编译携带的参数
vue 环境有很多套,我们需要根据不同环境设置不同的一些参数,如何不装任何依赖的情况下获取参数 下面是我制作官网,需要根据开发还是生产环境配置不同CDN,用vue-cli2+webpack,配置是再: ...
- TextView点击后背景颜色、文字颜色改变(转)
转自:http://blog.csdn.net/u013278940/article/details/51152655 TextView本没有点击效果,故为实现点击后文字颜色改变和背景改变,需要写se ...
- 怀旧浪潮来袭,小霸王游戏、windows95......曾经的经典哪些能戳中你的心怀?
随着前两天上架的 Rewound 在 iPhone 上复刻了 iPod Classic为大家掀起一场怀旧浪潮,那么除了 Rewound还有什么经典?今天我们就来怀旧一下那些曾经的经典.80经典小霸王游 ...
- 【leetcode】926.Flip String to Monotone Increasing
题目如下: A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possib ...
- 【架构】Linux结构
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...