什么是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下

最新文章

  1. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo
  2. js字符串和正则表达式中的match、replace、exec等的配合使用
  3. mybatis和ibatis控制台打印sql语句方法
  4. javascript原型Prototype【转】
  5. Ubuntu下安装php7后无法启动Apache
  6. springMVC图片文件上传功能的实现
  7. SpringMVC中出现&quot; 400 Bad Request &quot;错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
  8. MVC 服务器文件下载
  9. GNURadio For Windows编译安装脚本v1.1.1发布
  10. 纯代码添加约束条件(Auto Layout)
  11. Android 上使用 iconfont 的一种便捷方案
  12. Unix/Linux环境C编程入门教程(40) 初识文件操作
  13. LDAP基础
  14. 简单的web三层架构系统【第五版】
  15. jQuery切换网页皮肤并保存到Cookie示例代码
  16. wireshark_帧信息
  17. 用原生JS从零到一实现Redux架构
  18. Angular记录(5)
  19. 当使用makemigrations时报错No changes detected
  20. What to do when you have small dataset - 拥有小型数据集时该怎么办

热门文章

  1. DirectX 图形流水线
  2. 通通玩blend美工(2)——时钟
  3. Wow6432Node
  4. QT 自定义消息(超级简单的一个例子)
  5. windows管理员利器之用Log Parser Studio分析IIS日志(附逐浪CMS官方命令集)
  6. Win8 Metro(C#)数字图像处理--2.50图像运动模糊
  7. Have You Tried Delphi on Amazon Linux? (就是AWS用的Linux)
  8. mysql启动脚本
  9. PHP阿里大鱼短信验证
  10. 简单介绍几种Java后台开发常用框架组合