新手浅谈C#Task异步编程

  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 + 1; }, 1);
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 1; });
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 1; });
Console.WriteLine(task.Result);
var result = task.ContinueWith<int>((aa => { return aa.Result + 1; }));
Console.WriteLine(result.Result);

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

时间: 2024-10-25 16:16:03

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

Task异步编程

Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Async 结尾(良好的编码习惯)  根据约定,将“Async”追加到具有 async 修饰符的方法名称.如果某一约定中的事件.基类或接口协定建议其他名称,则可以忽略此约定.例如,你不应重命名常用事件处理程序,例如 btnOpen_Click. c) 返回类型如下: 如果方法有操作数为TResult 类型的

c#中的Task异步编程

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步编程模型(TAP)提供了对异步代码的抽象,将代码作为语句序列,可以在每个阶段完成下个阶段开始前读取代码,该过程中,编译器进行了多次转换,因为一些语句可能启动工作并返回正在进行的工作任务. Task异步编程的目标就是,启动类似于语句序列的代码,但当任务执行完成时,基于外部资源分配以一个更复杂的顺序执行

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

初学Task的时候上网搜索,看到很多文章的标题都是task取代thread等等相关,我也一直以为task和thread是一类,其实task是.net4.0提出的异步编程,在之前.net1.0有delegete.beginInoke(XXXX),还有.net2.0中的EAP,在最新的4.5中又有async.await这种新的异步编程.而Thread和Threadpool则是多线程编程. 但是Task也是把任务推到线程池中 1 static void Main(string[] args) 2 {

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

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

浅谈android中异步加载之&quot;取消异步加载&quot;二

首先,我得解释一下为什么我的标题取消异步加载打引号,这是因为可能最后实现效果并不是你自己想象中的那样.大家看取消异步加载,这不是很简单吗?AsyncTask中不是有一个cancel方法吗?直接调用该方法不就行了吗?但是事实上是这样的吗?如果真是这样,我相信我就没有以写这个作为一篇博客的必要了.为什么会有这样的想法呢?实际上源于我上一篇中Demo中的一个BUG,然后解决该BUG,需要去取消异步任务,是怎么样,我们不妨来看看. 首先,还是来一起回顾一下上篇博客中加载进度条Demo吧. AsyncTa

ios开发新手浅谈强大的runtime机制

runtime机制,实际上是一套底层的C语言代码,里面提供了很多的C数据类型和一些功能强大的C语言函数.我们所写的OC代码,在底层都是基于runtime来实现的.所以我们可以说OC实际就是披着面向对象外衣的C语言,因为在运行时,OC代码会编译成C/C++ 来运行.runtime中有很多的C函数,有着很强大的功能,比如 : 1. 能动态类的增删改 成员变量,方法 2.IOS Swizzle 能底层动态的交换两个方法(类方法和对象方法)的实现 IOS swizzle的具体做法: 1.在分类的load

新手浅谈C#关于abstract和interface

abstract:抽象类,是对某一类对象的抽象,继承抽象类的类和抽象类是属于关系 interface:接口,可以说是一种规范,继承接口的类表达则是,我继承了这个接口,我能做什么 举个常用的例子:抽象一个animal类,马(horse)继承animal类,但是有一种马叫天马,他能飞. 1 public abstract class Animal 2 { 3 public void EatFood() 4 { 5 //some code 6 } 7 } 8 9 public class Horse:

新手浅谈Future

Future到底是什么东西?很多人都对这个东西感到特别奇怪(好吧,我承认,那个很多人就只是我自己而已),就我现在的理解,因为本人在并发这方面没有 多少实践经验,所以只好就着一些资料和自己的理解给它下个定义,Future就是保存我们任务的完成信息,比如说,任务中会通过返回某些东西告诉别人它已 经结束了,而Future中就保存了这种信息.利用Futu保存和得到任务的结果的用法如下: Future<String> future = threadPool.submit(new Callable<

.Net4.6 Task 异步OA现金盘平台出租函数 比 同步函数 慢5倍 踩坑经历

异步Task简单介绍本标题有点 哗众取宠OA现金盘平台出租QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com ,各位都别介意(不排除个人技术能力问题) -- 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 -- 异步编程模型 .Net 4.6 给 Task 增加了好几个 特别实用的方法,而且引入了 await async 语法糖 当然,这是非常不错的技术,奈何我有自己的线程队列封装,也就没有着