什么是Task

Task是.Net4.0新增用来处理异步编程的,叫做基于“任务编程模型”,任务其实是架构在线程之上的,具体操作的时候还是由线程去执行的,任务的管控有点类似于线程池,程序中开10个Task,不一定对应的要开10个线程,他们并不是一一对应的关系。

  1. 创建Task 
    创建Task有两种方式,一种是直接实例化,另一种是使用任务工厂生成。
Task<int> ts = new Task<int>(TaskTest, 100);

public static int TaskTest(object state)
{
int data = (int)state;
int sum = 0;
for (int i = 0; i < data; i++)
{
sum++;
}
return sum;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里第一个参数为方法委托,可以直接传入要执行的方法名,值得注意的是这个方法的参数类型为object,若改为int,会编译不过,具体可去查看Task的构造函数的参数类型。 
当然也可以用Lamda表达式

Task<int> ts = new Task<int>((state) =>
{
int data = (int)state;
int sum = 0;
for (int i = 0; i < data; i++)
{
sum++;
}
return sum;
},10);
ts.Start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实例化的Task对象,必须用Start方法启动。 
第二种用任务工厂直接创建的无需用Start方法启动执行,创建后就会执行

 Task<int> task = Task.Factory.StartNew<int>(
(state) =>
{
int data = (int)state;
int sum = 0;
for (int i = 0; i < data; i++)
{
sum++;
}
return sum;
}, 10);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Task与Task的区别是,Task是没有返回值的,而Task是有返回值的,且返回值类型为T,对于没有返回值的Task,可用Wait方法等待其执行完成,有返回值得直接用task.Result即可,记住,在等待任务执行完的过程中,是会阻塞主线程的,这也就是async和await的的作用体现了。 
若有多个任务,比如任务1和任务2,且任务2要在任务1执行完毕后立刻启动执行,下面就来介绍Task.ContinueWith

static void Main(string[] args)
{
Task<int> ts1 = new Task<int>(() => {
return 100;
});
ts1.Start();
var re = ts1.ContinueWith<int>((task) => {
return task.Result + 200;
});
Console.WriteLine("执行结果:"+re.Result);
Console.ReadLine();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

 
ContinueWith 需将ts1作为参数进行传递,即总可以把前面的一个Task用ContinueWith传递给下一个要执行的Task,下面是任务工厂的写法

Task.Factory.StartNew<int>(() => { return 100; }).ContinueWith<int>(ts =>
{
return ts.Result + 200; }).ContinueWith(task => {
Console.WriteLine("执行结果:" + task.Result);
});
Console.ReadLine();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Mark下

什么是Task的更多相关文章

  1. Concepts:Request 和 Task

    当SQL Server Engine 接收到Session发出的Request时,SQL Server OS将Request和Task绑定,并为Task分配一个Workder.在TSQL Query执 ...

  2. .Net多线程编程—任务Task

    1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...

  3. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  4. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  5. Openstack Periodic Task

    Openstack Periodic Task 周期性任务在各个模块的manager.py(computer,scheduler,cell,network)中添加. 添加方法:在模块manager类实 ...

  6. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

  7. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  8. 定时管理器框架-Task.MainForm

    入住博客园4年多了,一直都是看别人的博客,学习别人的知识,为各个默默无私贡献自己技术总结的朋友们顶一个:这几天突然觉得是时候加入该队列中,贡献出自己微弱的力量,努力做到每个月有不同学习总结,知识学习的 ...

  9. Task三个列子的分享

    这次要分享的是C#Task任务的几个列子,感觉最实用的是封装的分页任务执行方法,这个方法步奏也是目前在我工作中执行多任务常用的,不知道各位也有这用的情况,那么开始吧. 1.顺序任务执行 //顺序任务执 ...

  10. webapi+Task并行请求不同接口实例

    标题的名称定义不知道是否准确,不过我想表达的意思就是使用Task特性来同时请求多个不同的接口,然后合并数据:我想这种场景的开发对于对接过其他公司接口的人不会陌生,本人也是列属于之内,更多的是使用最原始 ...

随机推荐

  1. Android开发四大件

    四大组件 Activity Activity是Android应用程序的界面,比如查看联系人.打电话.玩游戏的界面等一个应用程序通常包含多个Activity,即多个界面Activity通过布局管理各种V ...

  2. Httpclient Fluent API简单封装

    import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List ...

  3. MFC应用程序配置不正确解决方案(manifest对依赖的强文件名,WinSxs是windows XP以上版本提供的非托管并行缓存)

    [现象] 对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提 ...

  4. dotnetspider

    http://www.cnblogs.com/modestmt/p/5525467.html nuget :DotnetSpider2.Core

  5. Android零基础入门第46节:下拉框Spinner

    原文:Android零基础入门第46节:下拉框Spinner 上一期学习了GridView的使用,你已经掌握了吗?本期一起来学习Spinner的使用. 一.认识Spinner Spinner其实就是一 ...

  6. 开启Qt Lite Project

    发布: http://blog.qt.io/blog/2017/01/23/qt-5-8-released/ 说法一:Qt Lite” is not a tool, but a concept tha ...

  7. qt中如何用qDebug输出彩色调试信息

    原文 http://fanzhichao.blog.hexun.com/22330640_d.html 在终端输出彩色信息有点类似于html的语法,即在要输出的文字前加上转义字符. 指令格式如下\03 ...

  8. delphi中的copy函数和pos函数

    1.copy(‘csdn’,1,2) 返回的结果是 cs 注释: Copy有3个参数,第一个是要处理的字符串,第二个是要截取的开始位置,第三个是截取位数 当第三个参数大于字符长度,那么效果就是取开始位 ...

  9. Qt 中C++ static_cast 和 reinterpret_cast的区别(static_cast是隐式类型转换,会有数据损失,reinterpret_cast是底层二进制转换,没有数据损失)

    1.C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作.因此,被做为隐式类型转换使用.比如: int i; float f = 166.7f; i = static_cast ...

  10. canvas的进阶 - 学习利用canvas做一个炫酷的倒计时功能

    先给大家贴一张图片,因为我不会上传视频( ̄□ ̄||) ,请大家谅解了~  如果有知道怎么上传视频的大神还请指点指点 ^_^ ~ 然后看一下代码: html部分 :  <!DOCTYPE html ...