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 网格布局管理器

    //网格布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian3 extends JFrame{ //定义组件 JBut ...

  2. Redis各种数据结构内存占用测试

    启动时:(redis为空) 插入数据量都为100W(100W个key或者list中100W个值,或者1000个key,每个key中1000个值) String Key value # Memory u ...

  3. iPhone的定位技术与Core Location框架

    来源:http://www.cnblogs.com/lovecode/archive/2011/12/24/2300579.html iPhone定位来源通常有:1. GPS定位 2. WiFi定位 ...

  4. 建立dblink

    源地址:http://blog.itpub.net/24104981/viewspace-1116085/ create database link dblinkname connect to use ...

  5. [Flex] PopUpButton系列 —— 添加按钮图标

    <?xml version="1.0" encoding="utf-8"?><!--为主按钮添加默认图标 PopUpButtonIcon.mx ...

  6. python matplotlib plot 数据中的中文无法正常显示的解决办法

    转发自:http://blog.csdn.net/laoyaotask/article/details/22117745?utm_source=tuicool python matplotlib pl ...

  7. [SQL]多列的行转列

    create table t(name varchar(),subject varchar(),mark int) insert into t union all union all union al ...

  8. Codeforces 622F 「数学数论」「数学规律」

    题意: 给定n和k,求 1 ≤ n ≤ 109, 0 ≤ k ≤ 106 思路: 题目中给的提示是对于给定的k我们可以求出一个最高次为k+1的关于n的通项公式. 根据拉格郎日插值法,我们可以通过k+2 ...

  9. 自动以读写方式挂载ntfs-黑苹果之路

    在mac下ntfs分区总是以只读方式挂载,双操作系统,尤其有些时候需要用u盘,需要手工umount再mount,很麻烦,找了一些资料,通过修改/etc/fstab文件无效,要么就是使用第三方软件,不合 ...

  10. 在Ubuntu Server14.04上编译Android6.0源码

    此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...