async修改一个方法,表示其为异步方法。而await表示等待一个异步任务的执行。js方面,在es7中开始得以支持;而.net在c#5.0开始支持。本文章将分别简单介绍他们在js和.net中的基本用法。

一、在js中的实现

js中的异步,还是基于Promise实现的。没有Promise就办法谈异步了。并且await只能出现async修改的方法中;以及reject会触发catch(异常)。

class AsyncTest{
//simple example
    async run(){
//按照顺序等待后输出
let one = await this.output("one", 1000);
console.log('output:'   one);
let two = await this.output("two", 3000);
console.log(two);
console.log('run.....');
}
//await and Promise.all difference
    async runDiff(){
let one = this.output('diff one', 2000);
let two = this.output('diff two', 2000);
console.log(  await two   await one );  //在2秒之后,两个都输出了,而不是各自都等待两秒
console.log('runDiff.....');
}
//Promise.all realize
    runAll(){
let nowTime = new Date();
console.log('b:'   nowTime.toTimeString());
let array = ["a", "b", "c"];
let that = this;
array.forEach(async function(item){
console.log( await that.output(item, 2000) );//2秒后同时输出
        });
let fn = async ()=>{
for(let item of array){
let v = await this.output(item, 2000);
console.log(v ); //分步骤两秒执行
            }
}
fn.call(this);
}
premosFn(){
let nowTime = new Date();
console.log('b:'   nowTime.toTimeString());
let array = ["a", "b", "c"];
let that = this;
//promise.all
let preFn = async function(){
let promises = array.map(function(item){
return that.output(item,2000); //同时开启多个定时器
            });
let r = await Promise.all(promises);
console.log(r.join(','));
}
preFn();
}
reject(){
let rejectFn = function(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
reject();
},2000);
});
}
let asyncReject = async function(){
try{
await rejectFn();
}catch( e) {
console.log('reject.....');
}
}
asyncReject();
}
output(log, time){
return new Promise(resolve=>{
setTimeout(()=>{
var nowTime = new Date();
resolve( nowTime.toTimeString()   ":"   log   "\r\n");
}, time);
});
}
}

方法说明如下:

  • output:简单的输出方法,但返回了一Promise。
  • run: 使用await来等待两次对output的执行
  • runDiff:调用output时即创建promise。两个promise会同步执行
  • runAll:多任务同步执行和按步骤执行的实现方法。也就是forEach和for方法体中使用await的区别
  • premosFn: promise.all的使用。
  • reject: promise的reject会触发await的异常。

二、在c#中的实现

C#中异常是通过Task来实现的,所以标记了async的方法,其方法体中都可以出现await,否则不可以。以及Task中抛出的异常,如果没有同步等待,则不能获取异常

public class AsyncDemo
{
private Task<string> Output(string val, int time)
{
return System.Threading.Tasks.Task.Run(() =>
{
System.Threading.Thread.Sleep(time * 1000);
return (DateTime.Now.ToLongTimeString())   ": "   val   "\r\n";
});
}
public async System.Threading.Tasks.Task Run()
{
string oneVal = await Output("One", 2);
string twoVal = await Output("Two", 2);
System.Console.WriteLine("Run \r\n"   oneVal   " "   twoVal);
}
public async System.Threading.Tasks.Task RunDiff()
{
Task<string> oneTask = Output("one", 2);
Task<string> twoTask = Output("two", 2);
string val = await oneTask   await twoTask;
System.Console.WriteLine("RunDiff \r\n"   val);
}
public async System.Threading.Tasks.Task RunAll()
{
System.Console.WriteLine("b:"   (DateTime.Now.ToLongTimeString()));
string[] array = new string[3] { "a", "b", "c" };
foreach(var item in array)
{
string v = await Output(item, 2);
System.Console.WriteLine(v);
}
}
public async System.Threading.Tasks.Task PromiseFn()
{
System.Console.WriteLine("b:"   (DateTime.Now.ToLongTimeString()));
string[] array = new string[3] { "a", "b", "c" };
List<System.Threading.Tasks.Task<string>> tasks = new List<System.Threading.Tasks.Task<string>>();
foreach (var item in array)
{
tasks.Add(Output(item, 2));
}
//waitAll返回值不能获取,他返回为void,而WhenAll则返回为一个Task(这个Task就有其列表值)
string[] r = await System.Threading.Tasks.Task.WhenAll(tasks.ToArray());
System.Console.WriteLine(string.Join(",",r));
}
public async System.Threading.Tasks.Task Reject()
{
Func<System.Threading.Tasks.Task> func = async () =>
{
throw new Exception("custom...");
await Output("reject", 2);
};
await func();
}
}

调用代码如下:

AsyncDemo asyncDemo = new AsyncDemo();
asyncDemo.Run().Wait();
asyncDemo.RunDiff().Wait();
asyncDemo.RunAll().Wait();
asyncDemo.PromiseFn().Wait();
try
{
asyncDemo.Reject().Wait();
}catch(Exception e)
{
System.Console.WriteLine("reject ex");
}

上述代码就是Js的async和await在c#中的翻版实现。 其中每个异步方法的调用,都用到了Wait方法来进行同步等待。以获取到结果。而没有像Js中那么难以控制。尤其注意,async方法中异常的捕获。

三、两者的异同点

  • js中的async方法的调用,是没有wait方法来等待结果的执行的,只能通过promise来监听执行结果
  • c#中的async方法,由于推荐返回Task或者Task<T>,所以可以用Wait来等待执行结果,如果async方法返回为void,则与js类似。 C#中的下面示例方法的调用者捕获不了异常:
    public async void Run()
    {
    string oneVal = await Output("One", 2);
    string twoVal = await Output("Two", 2);
    System.Console.WriteLine("Run"   oneVal   " "   twoVal);
    }

  • c#中的Task可以异步方法的链式调用,即可将前一任务的执行结果作为第二任务的参数传入,当然js的Promise也完全是可以很轻松的实现:
System.Console.WriteLine("b:"   (DateTime.Now.ToLongTimeString()));
string[] array = new string[3] { "a", "b", "c" };
var r = await this.Output(array.First(), 2).ContinueWith((tsc) =>
{
string v = tsc.GetAwaiter().GetResult();
return this.Output(v   "02", 2);
});
System.Console.WriteLine(r.Result);

更多专业前端知识,请上 【猿2048】www.mk2048.com

async 和 await 之异步编程的学习相关推荐

  1. 使用 Async 和 Await 的异步编程

    来自:http://msdn.microsoft.com/library/vstudio/hh191443 异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访 ...

  2. 利用 async amp; await 的异步编程

    一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framework 4.5 ...

  3. 第十节:利用async和await简化异步编程模式的几种写法

    一. async和await简介 PS:简介 1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程更简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算. 2. ...

  4. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...

  5. es7 async、await定义异步函数执行同步操作

    ES7 async定义函数1.可以在不阻塞主线程的情况下,使用同步代码实现异步访问资源的能力,让我们的代码逻辑更清晰2.await Promise.resolve(内容): 返回值为resolve的参 ...

  6. .NET异步编程之新利器——Task与Await、Async

    一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用 ...

  7. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  8. 网络编程异步_概括地说,网络异步编程

    网络编程异步 重点(Top highlight) Asynchronous programming is not a new concept and has been around for sever ...

  9. C# 异步编程模式 APM、EAP、TPL

    目录 异步编程模式 APM异步编程模型 APM的本质 APM的实现 读取的同步方法: BeginXxx方法--读取的异步方法: EndXxx方法--结束异步操作 异步调用的结果--与IAsyncRes ...

最新文章

  1. Windows cmd(DOS)命令窗口中echo命令ANSI转义显示彩色字或背景
  2. 078_html5Canvas
  3. 非阻塞,send后马上close消息能成功发出去吗
  4. android uri转drawable,Glide4(URL转File,URL转Drawable)
  5. Netty完成网络通信(二)
  6. 英语人机考试计算机算分吗,英语人机对话考试技巧
  7. 领域应用 | 如何将知识图谱特征学习应用到推荐系统?
  8. Redux简介以及Redux应用程序中的状态更新方式
  9. python实现柱状图_python3+PyQt5实现柱状图
  10. vs2015professional过期后登录微软账户仍然不能使用的解决方法
  11. 数据密集型应用系统设计--数据分区
  12. 我眼中的分布式系统可观测性
  13. linux下安装cudnn
  14. springboot requestmapping 正则_SpringBoot三招组合拳,手把手教你打出优雅的后端接口...
  15. jquery-ajax请求.NET MVC 后台
  16. 在手动安装 Kubernetes 的基础上搭建微服务
  17. note8 升级android9,明年升!三星七大旗舰集体获安卓9.0认证:这阵容赢了!
  18. 关于冒泡、快排、二分排序算法分析
  19. Python自动登录QQ的实现示例
  20. 赢在CSDN,我的CSDN成长之路,让子弹飞一会儿

热门文章

  1. MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入
  2. mysql 事实表 维度表_数据库的事实表与维度表
  3. 【锁相环系列3】QPSK解调之Costas锁相环去小频偏(重点环路滤波器参数设置和迭代核心代码详解)
  4. 服务器可以装两个系统吗,云服务器可以装多个系统吗
  5. c语言 在txt文件中搜索关键词_网络推广外包—网络推广外包如何在搜索引擎中体现关键词优化效果...
  6. C++一天一个程序(八)
  7. 仪征市第二中学计算机老师,静心倾听花自开 ——仪征市第二中学徐丞老师
  8. ajax的请求参数详解以及前后台交互详解
  9. python_fullstack基础(十一)-常用模块
  10. RecyclerView滑动到底部自动加载