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. 函数调用和给对象发消息(Runtime理解)

    在写代码的时候这个差距其实是不打看的出得,很多时候也就无所谓叫什么,很多人为了便于理解,干脆就叫函数调用.这个其实应该是oc的一个特色,消息发送.具体的类typedef struct objc_cla ...

  2. TestNG关键字和testNG.xml结构学习

    转自官网:http://testng.org/doc/documentation-main.html#test-results TestNG关键字 @BeforeSuite@AfterSuite@Be ...

  3. 在线程中进行读取并写入文件和wenjia

    新人求(胸)罩!!! import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException ...

  4. CentOS 安装 Tomcat

    1.Tomcat官网获(http://tomcat.apache.org/)取tar.gz文件的下载地址 2.下载: # wget http://apache.fayea.com/tomcat/tom ...

  5. 用Lighttpd做图片服务器

    http://www.lsanotes.cn/install_lighttpd 用Lighttpd做图片服务器 一.安装lighttpd所需的库文件1.安装 pcrewgetftp://ftp.csx ...

  6. iOS 短信验证码倒计时按钮的实现

    验证码倒计时按钮的应用是非常普遍的,本文介绍了IOS实现验证码倒计时功能,点击获取验证码,进入时间倒计时,感兴趣的小伙伴们可以参考一下: 实现思路: 创建按钮,添加点击方法: 用NSTimer定时器, ...

  7. 使用 trait 时报PHP Parse error: syntax error, unexpected 'use' (T_USE) 这个错误

    找一大圈原因, 最后终于找到了, 不是PHP版本的原因[], 是自己把use 写到了类里的方法里了. 这个东东,  不能脱离类单独使用, 否则的话, 会被认为是命名空间了. 测试例子如下 // Tra ...

  8. sublime text3 插件配置

    (转) sublme text 全程指引:http://www.cnblogs.com/figure9/p/sublime-text-complete-guide.html 使用Package Con ...

  9. KMP学习笔记

    功能 字符串T,长度为n. 模板串P,长度为m.在字符串T中找到匹配点i,使得从i开始T[i]=P[0], T[i+1]=P[1], . . . , T[i+m-1]=P[m-1] KMP算法先用O( ...

  10. Manacher算法求回文半径

    http://wenku.baidu.com/link?url=WFI8QEEfzxng9jGCmWHoKn0JBuHNfhZ-tKTDMux34CeY8UNUwLVPeY5HA3TyoKU2XegX ...