异步编程的前进历史发展历史

 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(伊夫(Eve)nt-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

 

发表评论

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