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. kvm编译安装及常见问题解决

    一.KVM的编译安装 1.安装基本系统和开发工具 1.1 编译内核 mkdir /root/kvm cd /root/kvm wget http://www.kernel.org/pub/linux/ ...

  2. hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)

    Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...

  3. inux常用命令大全

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  4. 《JS原型》

    @(JavaScript原型) JavaScript中最晦涩难懂的恐怕就是原型了.故以此笔记本来记录原型的学习过程,日后忘了可来温习. 一切皆为对象 null--Object&Function ...

  5. selenium webdriver启动Chrome浏览器后无法输入网址的解决办法

    通过selenium webdriver启动Chrome浏览器,脚本如下: from selenium import webdriver browser = webdriver.Chrome() br ...

  6. Delphi图像处理 -- RGB与HSL转换

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  7. 设计模式21---设计模式之享元模式(Flyweight)(结构型)

    1.讲解享元模式(结构型) 1.1享元模式定义 运用共享技术有效地支持大量细粒度对象. 享元:把内部状态共享出来 1.2享元模式要点 重点在于分离变与不变. 把一个对象的状态分为内部状态和外部状态,内 ...

  8. VB.NET版机房收费系统—DataGridView应用

    事实上,先前刚刚開始敲机房的时候,刚用到DataGridView的时候,总显得力不从心,先要一下子就学会,看了非常多的资料,但是依照写的时候,自己有不知道从什么地方下手,于是,当自己用查询SQL语句, ...

  9. Codeforces 437B The Child and Set

    题目链接:Codeforces 437B The Child and Set 開始是想到了这样的情况,比方lowbit之后从大到小排序后有这么几个数,200.100,60.50.S = 210.那先选 ...

  10. [Angular 2] Use Service use Typescript

    When creating a service, need to inject the sercive into the bootstrap(): import {bootstrap, Compone ...