Task 是 .Net4.0 新出的异步调用方法,粗略看了一下基本对外屏蔽了线程的概念,写异步调用更专注于应用本身。

    public class Program
{
static void Main(string[] args)
{
//打印主线程
Console.WriteLine("Main thread id is {0}.", Thread.CurrentThread.ManagedThreadId); //创建任务1
var task1 = new Task(() =>
{
Console.WriteLine("Hello, I am task1, thread id:{0}.", Thread.CurrentThread.ManagedThreadId);
}); //打印任务1ID
Console.WriteLine("Task1 id is {0}.", task1.Id); //任务1的 ContinueWith 使用的 Task 参数就是已经结束的任务, 使用的线程与 task1 也相同
var newtask = task1.ContinueWith((t) =>
{
Console.WriteLine("Task1 status is" + t.Status + ", thread is:{0}, param task id:{1}.", Thread.CurrentThread.ManagedThreadId, t.Id);
}); //新任务的ID与task1不同,相当于在线程上顺序执行了2个task
Console.WriteLine("Newtask1 id is {0}.", newtask.Id);
task1.Start(); //另一种建立任务的方式
var task2 = Task.Factory.StartNew(() =>
{
Console.WriteLine("Hello, I am task2, thread id:{0}.", Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("Task2 id is {0}.", task2.Id); var task3 = Task.Run(() =>
{
Console.WriteLine("Hello, this is task3. thread id:{0}.", Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("Task3 id is {0}.", task3.Id); Console.Read();
}
}

执行结果:

可以看到:

1. 每种执行异步方法的任务ID都是不同的;

2. task1 与 task 在同一个线程上执行,意味着任务数与线程数并不一一对应,应该是有一个线程池在支持;

3. ContinueWith 会在一个任务执行后紧接着再执行一个任务,后者以前者为参数,但所在线程并不一定相同;

如果需要获取 Task 的返回值,借用一个例子(出处:http://www.teahoo.net/IT/20151031599.html):

    public class Program
{
static void Main(string[] args)
{
var t1 = Task.Factory.StartNew<List<string>>(() =>
{
return new List<string> { "", "", "" };
}); t1.Wait(); var t2 = Task.Factory.StartNew(() =>
{
Console.WriteLine("t1 返回的数据:" + string.Join(",", t1.Result));
}); Console.Read();
}
}

async 与 await 的作用:

先看一个没有使用 async 与 await 的例子:

    public class TaskTest
{
public Task<string> TaskGetString()
{
return Task.Run<string>(() =>
{
Console.WriteLine("Task is running!");
return "I am here!";
});
} public void TestFunc()
{
var task = this.TaskGetString();
Console.WriteLine("Test flag.");
Console.WriteLine(task.Result);
}
} public class Program
{
static void Main(string[] args)
{
var democlass = new TaskTest();
democlass.TestFunc();
Console.Read();
}
}

  可以看出先同步打印出了 “TestFlag”,再执行到了 异步任务的内部,打印出 “I am here”。

  对代码稍作修改:

    public class TaskTest
{
public async Task<string> TaskGetString()
{
return await Task.Run<string>(() =>
{
Console.WriteLine("Task is running!");
return "I am here!";
});
} public void TestFunc()
{
var returnstring = this.TaskGetString();
Console.WriteLine("Test flag.");
Console.WriteLine(returnstring);
}
} public class Program
{
static void Main(string[] args)
{
var democlass = new TaskTest();
democlass.TestFunc();
Console.Read();
}
}

可以看到 “Test Flag” 出现在 “Task is running” 之后,继而可以看出 async 与 await 的作用来:

1. async 用于声明包含有“异步方法” 的方法,该方法的返回值是 “异步回调的返回值”, 而不是 该方法的返回值;

2. await 用于修饰真正的异步调用,该关键字会将之后的代码封装成一个委托,等异步调用结束后再执行。正因为如此,才能直接获取“异步调用的返回值”;

.Net 4.5 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. MAVEN 工程打包resources目录外的更多资源文件

    首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...

  2. centos 5 yum安装与配置vsFTPd FTP服务器

    vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...

  3. HDU 2222 AC自动机 裸题

    题意: 问母串中出现多少个模式串 注意ac自动机的节点总数 #include <stdio.h> #include <string.h> #include <queue& ...

  4. FindControl的使用方法

    Control.FindControl (String):在当前的命名容器中搜索带指定 id参数的服务器控件.(有点类似javascript中的getElementById(string)) 简单的例 ...

  5. 一键安装lnmp脚本

    前段时间一直在找一个快速部署lnmp环境的方法,也没找着,就自己写了一个,结合网上的大神们的.我的方法是脚本结合源码包,很多依赖裤都是yum安装的,这都在脚本里面,需要的源码包我都下载好了,打包成压缩 ...

  6. __block的作用

    __block 的标记告诉编译器,这个变量在 block 里面需要做特殊处理. 一般来说,在 block 中用的变量值是被复制过来的,所以对于变量本身的修改并不会影响这个变量的真实值.而当我们用 __ ...

  7. poj 3171 Cleaning Shifts(区间的最小覆盖价值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2743   Accepted: 955 De ...

  8. 给想上MIT的牛学生说几句

    [来信] 老师您好! 非常冒昧的来打搅您,仅仅是在学习上实在有些困惑才来向您求教一番. 我是计算机科学与技术的大一学生,我非常喜欢我自己的专业,可是学校里讲的东西太慢,太浅,所以我一般都是自学,我在自 ...

  9. Linux在山Windows共享文件夹

    $ sudo mount.cifs //windows-ip/shared  /media/ -o user=username password=password 该命令挂载Windows在下面sha ...

  10. TwoSAT算法模板

    该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真”  等价于 “Xi为假 –& ...