Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async、await,这儿我们先说Task相关。

  在实际编程中,我们用的较多的是Task、Task.Factory.StarNew、Task.Run,接下来简单的表述下我的理解。

  

//传入Func委托
Task<int> task = new Task<int>(a => { return (int)a + ; }, );
task.Start();
Console.WriteLine(task.Result); //传入Action委托
Task task1 = new Task(() => Console.WriteLine("a"));
task1.Start();

实例化的Task对象,需要调用Start来启动任务,如果使用Task.Factory.StarNew,则不用调用Start方法来启动任务。

var task = Task.Factory.StartNew<int>(() => { return ; });
Console.WriteLine(task.Result); var task1 = Task.Factory.StartNew(() => Console.WriteLine("这是StartNew......"));

Task.Run的跟Task.Factory.StarNew和new Task相差不多,不同的是前两种是放进线程池立即执行,而Task.Run则是等线程池空闲后在执行。

Run方法只接受无参的Action和Func委托,另外两个接受一个object类型的参数。

在msdn中TaskFactory.StartNew的备注信息如下:

它们都可以调用Wait方法来阻塞当前线程,还可以通过Task.Result来获取返回值,当然它也会阻塞当前线程。

接下来再说说常用的ContinueWith,这个说白了就是在某个任务执行完的延续,类似callback

var task = Task.Factory.StartNew<int>(() => { return ; });
Console.WriteLine(task.Result);
var result = task.ContinueWith<int>((aa => { return aa.Result + ; }));
Console.WriteLine(result.Result);

continuewith接受action或func委托,委托的第一个参数都是task类型,可以通过它访问先前的task对象

这里有个下提示,关于线程安全的(参考的这里http://q.cnblogs.com/q/65147/),代码如下

//这是线程不安全,直接调用外部参数
static void TestRun(string Name,int Age)
{
Task.Factory.StartNew(() => Console.WriteLine("name:{0} age:{1}", Name, Age));
} //如果你确定底层封装好了,可以像上面那样写,但建议写成下面这种
static void TestRun(string Name,int Age)
{
Task.Factory.StartNew(obj =>
{
var o = (dynamic)obj;
Console.WriteLine("name:{0} age:{1}", o.Name, o.Age);
}, new { Name, Age });
}

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

  1. Task异步编程

    Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...

  2. c#中的Task异步编程

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步 ...

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

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

  4. Task 异步编程测试案例及基础应用说明

    对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为tas ...

  5. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  6. 浅谈C#关于AOP编程的学习总结

    难得在这样一个节日里给写出一篇博客,却没有佳人相约,没办法,这就是一个程(dan)序(shen)猿(gou)的真实生活情景,每天除了coding还是coding.唉..污染各位看官的眼了.好吧,进入正 ...

  7. Task异步编程,刨根到底

    1. 编译器到底对await做了什么 await 一个异步操作的时候,实际上编译器会创建一个状态机,这个状态机包含了调用者的上下文变量,状态机使用yield迭代器实现,状态机由clr调度,每次运行都会 ...

  8. 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC

    1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...

  9. 01 浅谈c++及面向对象编程

    参考链接: 学习完c++但是对c++面向对象编程还是比较模糊,现在花时间总体来总结一下: c++中的对象是使用类来定义的,下面先重点讲一下类的概念. 说到类就要先说一下类的三种特性:封装,继承,多态. ...

随机推荐

  1. Java链式方法 连贯接口(fluent interface)

    有两种情况可运用链式方法: 第一种  除最后一个方法外,每个方法都返回一个对象 object2 = object1.method1(); object3 = object2.method2(); ob ...

  2. 文件下载(只需要简单的四步),Java中都通用

    我们就直接切入主题啦,文件下载只需要四步: 1.设置文件ContentType类型 2.设置文件头 3.通过response获取ServletOutputStream对象(out) 4.写到输出流(o ...

  3. oracle查看所有表的数据量

    源地址:http://blog.csdn.net/zhanggnol/article/details/6683697 select t.table_name,t.num_rows from user_ ...

  4. Date.UTC日期格式

    日期格式 %a: 简短型星期,比如‘Mon’. %A: 完整型星期, 比如‘Monday’. %d: 两位的日期, 从01到31. %e: 数字型日期,从 1 到 31. %b: 简短型月份, 比如  ...

  5. Mysql 学习笔记 20140219

    1. Mysql常用命令:每个命令以分号结束. create database name;          创建数据库 use databasename;              选择数据库 dr ...

  6. Codeforces 626C Block Towers「贪心」「二分」「数学规律」

    题意: 一堆人用方块盖塔,有n个人每次只能加两块方块,有m个人每次只能加三块方块.要求每个人盖的塔的高度都不一样,保证所用方块数最少,求最高的塔的高度. 0<=n+m  0<=n,m< ...

  7. ORACLE快速彻底Kill掉的会话(转载)

    转载:http://www.cnblogs.com/kerrycode/p/4034231.html 在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid ...

  8. JavaScript对象的创建之基于构造方法+原型方式

    为了解决原型所带来的问题,此处需要通过组合构造方法和原型来实现对象的创建,将属性在构造方法中定义,将方法在原型中定义.这种有效集合了两者的优点,是目前最为常用的一种方式. function Perso ...

  9. 在word中做复选框打对勾钩

    在word中做复选框打对勾钩 现在终于搞明白正确的操作方法 一.你在word里输入2610,按alt+X就能出 空checkbox 你在word里输入2611,按alt+X就能出 打了勾的checkb ...

  10. 使用Spring的Property文件存储测试数据 - 编写测试和调用测试数据

    准备好测试数据后,我们可以开始编写测试了,在测试用例中调用我们property文件中的测试数据. 我自己写了一个TestCase作为所有测试类基类,基类中定义了两个变量来代表之前建好的两个测试数据文件 ...