Atitit.异步编程的提高历史 1.1. TAP & async/await

 Atitit.异步编程的发展历史 1.1. TAP & async/await

 

 

 

1. 异步编程的进化历史1

1.1. Thread1

1.2. Task1

1.3. Async await2

1.3.1. await 的原形2

2. 泛的异步模式主要发生callbaks,listeners(一种观察者模式),promise,3

3. 贯彻异步编程有4种方式而供应选择,这4栽访求实际上为针对许正在4种植异步调用的模式,分为“等待”和“回调”两非常类。4

3.1. APM4

3.2. EAP5

3.3. TAP & async/await5

3.4. async/await及时点儿只新增的主要字就是语法糖,编译后的代码不新建线程
5

4. 参考6

 

 

1. 异步编程的升华历史

1.1. Thread

 

1.2. Task

 

 

返回值

Thead是不能够返回回值的,但是当再尖端的Task当然要弥补一下以此作用。

1. static void Main() {  

2.     // GetDayOfThisWeek 运行于另外一个线程中  

3.     var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); });  

4.     Console.WriteLine(“今天是:{0}”,dayName.Result);  

5. } 

 

 

1.3. Async await

 

勿晓哪些去处理了。那今天咱们虽来好看就半兄弟同她俩之叔叔(Task)爷爷(Thread)们究竟发生什么区别及特色,本文将会晤对Thread 到 Task 再届 .NET 4.5底 async和 await,这三种植办法下的互编程作一个概括性的牵线连:开启线程,线程结果返回,线程中止,线程中之坏处理等。

 

Task是默认会直接使用线程池,但是Thread不见面。如果我们不利用Task,又想用线程池的话,可以行使ThreadPool类。

 

笔者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

 

 

1.3.1. await 的原形

await后的之尽各个 

发展历史 1

感谢 locus的指正, await 之后非会见打开新的线程(await 从来不会张开新的线程),所以地方的希冀是起几许题目的。

await 不会见打开新的线程,当前线程会一直于下走直到遇到真正的Async方法(比如说HttpClient.GetStringAsync),这个法子的内会就此Task.Run或者Task.Factory.StartNew 去开线程。也就算是如措施不是.NET为咱提供的Async方法,我们用团结创办Task,才见面真的

await并无是针对于async的主意,而是指向async方法所返给咱们的Task,这也是干吗有的async方法都必返回给咱Task。所以我们一致可以Task前面为长await关键字,这样做实在是报告编译器我待等这Task的返回值或者当是Task执行完毕后才会延续为生移动。

 

Task.GetAwait()方法会于我们回来一个awaitable的对象,通过调用这个目标的GetResult方法就会挂于主线程,当然为不是有的景况尚且见面挂于。还记我们Task的表征也? 在同样初始之时段便开动了别一个线程去履行这个Task,当我们调整用她的结果的时节如果此Task已经履行完毕,主线程是不用等待可以一直将那个结果的,如果无实施了那主线程就得挂起等待了。

await 实质是以调用awaitable对象的GetResult方法

1. / 这里主线程会挂起等待,直到task执行完毕我们拿到回结果  

2.     var result = task.GetAwaiter().GetResult();    

3.     // 这里不见面挂起等待,因为task已经尽了了,我们好直接拿到结果  

4.     var result2 = await task;       

 

 

 

 

 

Java has a class called java.util.concurrent.Future which is equivalent to the C# Task class.

You can set off work on a java.util.concurrent.Executor object. There are many implementations but ForkJoinTask.fork() is worth a look if you hit thread limits as soon as you try this.

You will be given a Future when you start work. Your method will carry on running. When you need the result from your Future you call get() and it will block until the result is ready. This is similar to using the await keyword in C#.

2. 普遍的异步模式要出callbaks,listeners(一种植观察者模式),promise,

listeners这为是一样种常见的异步编程方式,如:

$elem.on(‘click’,doClick);function doClick(){      //do something};

设计模式中将这种办法叫命令模式。这种办法的功利是若可挂号多独事件,待事件触发时调用注册之函数。

Promise异步编程总起来就是贯彻了thenable,说的复直白的少数即使是自己与你是好爱人,我说不定有事需要你拉,你随时候着吧,有需要我会第一时间通知你。你与小王也是好哥们,并一致告诉您待外拉,并第一时间通知他。当然你打招呼他是于自打招呼你以后。用伪代码表示:

myself(function(){          callXiaoLi();    })    .then(function(){         //我是小李,你喊我了,我虽夺喊小王         callXiaowang();    })    .then(function(){ console.log(‘我是稍微王’);  });

then实现比较绕,需要解释一下,如:.then(xx).then()

每次.then时会见变动一个初的promise对象, 就是说后一个then是登记为上一个promise对象的,其出发条件依赖让上一个.then时别的promise。

若是达一个.then 最后回到结果是非promise对象(即没有then方法),则一直 resolve

若达到一个.then最后回到的结果是promise对象,那.then生成的promise必须借助返回结果遭到之promise,及内层的 promise.then( “.then时变的promise”.resolve)

3. 落实异步编程有4种植方式而供应选择,这4种访求实际上也本着承诺着4栽异步调用的模式,分为“等待”和“回调”两不胜类。

 

3.1. APM

C# .NET最早出现的异步编程模式于称之为APM(Asynchronous Programming Model)。这种模式要是因为同样针对性Begin/End开头的结合。BeginXXX方法用于启动一个耗时操作(需要异步执行的代码段)

3.2. EAP

在C# .NET第二单版中,增加了一如既往种植新的异步编程模型EAP(Event-based Asynchronous Pattern),EAP模式之异步代码中,典型特征是一个Async结尾的艺术与Completed结尾的风波。XXXCompleted事件将当异步处理好时让点,在事件之处理函数中可以操作异步方法的结果。往往以EAP代码中尚会有叫吧CancelAsync的点子用来取消异步操作,以及一个ProgressChenged结尾的轩然大波就此来报告操作进度。通过这种办法支持取消和速汇报也是EAP比APM更发出优势的地方。通过后文TAP的牵线,你会意识EAP中取消机制没有可延续性,并且不是格外通用

3.3. TAP & async/await

从.NET4.0初始新增了一个称呼也TPL的仓库重点负责异步和并行操作的拍卖,目标便是如果异步和出现操作发生只统一之操作界面。TPL库的主干是Task类,有了Task几乎不用像之前版本的异步和产出那样去与Thread等脚类打交道,作为使用者的我们才待处理好Task,Task背后有一个称为也底TaskScheduler的好像来拍卖Task在Thread上的履行。可以这么说TaskScheduler和Task就是.NET4.0受异步和出现操作的底蕴,也是我们刻画代码时未次之精选。

3.4. async/await随即简单单新增的严重性字就是语法糖,编译后的代码不新建线程

await 不见面开新的线程,当前线程会一直向生活动直到撞真正的Async方法(比如说HttpClient.GetStringAsync),这个措施的里会为此Task.Run或者Task.Factory.StartNew 去开线程。也便是只要方式无是.NET为我们提供的Async方法,我们要好创建Task,才见面真的的去创造线程。

4. 参考

async & await 的前生今生 – 51CTO.COM.htm

若所必须掌握的老三栽异步编程方法callbacks,listeners,promise_JavaScript_第七都市市.htm

.NET异步编程总结—-季栽实现模式 – DebugLZQ – 博客园.htm

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注