概念: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中的运行结果的三种方式的更多相关文章

  1. 在Tomcat中部署web项目的三种方式

    搬瓦工搭建SS教程 SSR免费节点:http://www.xiaokeli.me 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Man ...

  2. Tomcat中部署web应用的三种方式

    Tomcat中部署web应用的三种方式(静态部署)       第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...

  3. spring中创建bean对象的三种方式以及作用范围

    时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...

  4. Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  5. [转]Linux中设置服务自启动的三种方式

    from:http://www.cnblogs.com/nerxious/archive/2013/01/18/2866548.html 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统 ...

  6. Linux中设置服务自启动的三种方式,ln -s 建立启动软连接

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务(http://www.0830120.com) 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立 ...

  7. (转)Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  8. 【转发】Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  9. Java中 实现多线程成的三种方式(继承,实现,匿名内部类)

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. 在tkinter中使用matplotlib

    import sys import tkinter as Tk import matplotlib from numpy import arange, sin, pi from matplotlib. ...

  2. C#实体类get和set的作用

    一,实体类属性访问存在两种写法: //第一种写法 private int _id; public int Id { set { _id = value; } get { return _id; } } ...

  3. css 设置div基于父元素宽度的宽高相等的样式

    1. 前言 在移动开发中,有时候需要设置一个宽高相等的div,并且为了使它能够适配更多的屏幕,于是需要让它的宽高和屏幕宽高成一定的比例.这里将提供一个css的解决方案,让一些后端开发不用再写繁琐的js ...

  4. linux文件管理--压缩打包

    目录 linux文件管理--压缩打包 1.压缩打包介绍 2.gzip压缩工具 3.zip压缩工具 注意: 4.tar压缩工具 5.tar生产案例实践 linux文件管理--压缩打包 1.压缩打包介绍 ...

  5. Sublime Text 3 - there are no packages available for installation 解决方法

    解决方法: 1. 下载一个channel_v3.json ,  提取码: n2vc 2. 进入以下路径的设置界面 3. 添加代码 , 文件路径以各自下载保存路径为准 ( 重启sublime, 搞定 ! ...

  6. solaris系统动态查看swap的使用情况

    root@tt # root@tt # prstat  -aPlease wait... PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU ...

  7. 深度学习练手项目——DNN识别手写数字

    该案例主要目的是为了熟悉Keras基本用法,以及了解DNN基本流程. 示例代码: import numpy as np import matplotlib.pyplot as plt from ker ...

  8. java--ArrayList,LinkedList应用比较

    import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListDem ...

  9. Delphi ini文件操作 TIniFile、TMemIniFile

    1.使用TIniFile unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  10. 绝不划水队Alpha冲刺阶段博客目录

    绝不划水队Alpha冲刺阶段博客目录 一.Scrum Meeting 第六周会议记录 第七周会议记录 二.测试报告 alpha阶段测试报告 三.习得的软工原理/方法/技能? 李浩杰: (1)一开始分工 ...