上一篇讲到了.Net4.5新增的async和await关键字,其实async和await算是一组标记,真正实现异步操作的是Task新开的任务线程。

什么是Task

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

  1. 创建Task 
    创建Task有两种方式,一种是直接实例化,另一种是使用任务工厂生成。
  1. Task<int> ts = new Task<int>(TaskTest, 100);
  2. public static int TaskTest(object state)
  3. {
  4. int data = (int)state;
  5. int sum = 0;
  6. for (int i = 0; i < data; i++)
  7. {
  8. sum++;
  9. }
  10. return sum;
  11. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

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

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

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

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

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

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

C#异步编程之浅谈Task的更多相关文章

  1. 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    [源码下载] 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 作者:webabcd 介绍 ...

  2. 新手浅谈Task异步编程和Thread多线程编程

    初学Task的时候上网搜索,看到很多文章的标题都是task取代thread等等相关,我也一直以为task和thread是一类,其实task是.net4.0提出的异步编程,在之前.net1.0有dele ...

  3. 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  4. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

  5. 浅谈Task的用法

    Task是用来实现多线程的类,在以前当版本中已经有了Thread及ThreadPool,为什么还要提出Task类呢,这是因为直接操作Thread及ThreadPool,向线程中传递参数,获取线程的返回 ...

  6. JQuery 之 Ajax 异步和同步浅谈

    Ajax 同步和异步的区别 同步是当 JS 代码加载到当前 Ajax 的时候会把页面里所有的代码停止加载,页面出现假死状态:当这个 Ajax 执行完毕后才会继续运行其他代码此时页面假死状态才会解除.反 ...

  7. 【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案

    引子 现如今手游开发中网络编程是必不可少的重要一环,如果使用的是TCP协议的话,那么不可避免的就会遇见TCP粘包和拆包的问题,马三觉得haifeiWu博主的 TCP 粘包问题浅析及其解决方案 这篇博客 ...

  8. Objective-C编程 - 1. 浅谈内存分配

    Objective-C语言的对象类型都必须用指针,对象所占的内存是在堆(heap)上分配的. NSString也必须在堆上分配,因此必须用指针. NSString *someString = @&qu ...

  9. PHP中MVC的编程思想浅谈

    我相信这样的文章已经被写烂了,但是我今天还是愿意冒着风险把自己的经验与大家分享一下.纯属原创,我也没什么可保留,希望对新手有帮助,有说的什么不对的地方,欢迎大家伙吐槽. 什么是MVC? 简单的说就是将 ...

随机推荐

  1. 检测session用户信息跳转首页界面

    方案一:采用jsp方式检测用户信息跳转 <%@ page language="java" pageEncoding="UTF-8"%> <%@ ...

  2. vue实践---根据不同环境,自动转换请求的url地址

    一般的项目环境分为:本地环境,测试环境,预发环境,正式环境. 这些环境的域名一般是一样的, 前端请求接口的url也会随着这些环境的变化而改变,手动修改有点麻烦,所以想个办法,让请求的地址根据域名改变而 ...

  3. 如何通过Google访问外网

    修改host: https://laod.cn/hosts/2017-google-hosts.html google中文: https://www.google.com.hk/ 弄好前两项后,可以再 ...

  4. 安装virtualBox 增强包

    1 在原始操作系统安装. 2 打开USB设置. 3 运行虚拟机中的Linux中,Device->install guest additions 再安装增强包. 4 插入U盘,如果这时可以看到U盘 ...

  5. 计算点与x轴正半轴夹角atan2(double y,double x),返回弧度制(-PI,PI]

    精度比acos , asin 什么的高些. Parameters y Value representing the proportion of the y-coordinate. x Value re ...

  6. 【HTML5开发系列】CSS3

    选择器 属性 背景和边框 盒模型 布局 文本 动画 其他

  7. css position: relative,absolute具体解释

    关于CSS中 position在布局中非常重要,查了非常多资料都说的非常难理解.以下说说个人的理解: 语法: position: relative | absolute relative: 对象遵循常 ...

  8. 阿里云CentOS7安装Docker

    买了阿里云主机,由于学生有优惠,玩起来确实爽. 系统版本: [root@lxd ~]# cat /etc/redhat-release CentOS Linux release 7.0.1406 (C ...

  9. Android shape制作圆角、虚线、渐变

    xml控件配置属性 android:background="@drawable/shape" 标签 corners ----------圆角 gradient ---------- ...

  10. 关于用JAVA开发短信方面的知识

      现在流行的网络业务莫过于短信了.网易新浪等都因此而盈利,股价上涨.我凭自己的经验和公司支持,也就乘着东风来研究一下了! 首先,你要选择一台移动或者联通的短信服务器做你们的发送短信接口.这是最关键的 ...