C# 异步调用之async及await关键字

        C#中的异步调用中async及await关键字的调用把异步调用做到了极致,得用这两个关键子,你可以像编写串行程序一样写异步调用程序。

        异步调用通常用来处理耗时操作,比如从互联网加下载多媒体文件,在串行程序中联网操作容易导致程序假死,因此通常采用异步来进行这些耗时操作。所谓异步就是,当要进行耗时操作,如下载图片的时候,程序就另外开一个线程,让这个线程去下载图片,一旦下载图片的命令发出后,主线程不等待(即同步)图片下载完就继续执行。这时一个自然的问题就是当新开的线程图片下载完了该怎么办,像JAVA及旧版本的C#的片理就是添加一个回调函数,所谓回调函数就是主线程让新线程去下载图片,同时告诉新线程图片下载完了就要执行这个函数(即回调函数)。这个一个非常自然的过程。然而微软的工程师不这么认为,他们为了C#程序员的美好生活又把回调做成一个await关键子就能搞定的东西。

      废话了这么多,来看一个例子:

public async void get() 
{
    HttpClient c = new HttpClient();
    String res = await c.getStringAsync(url);
    Console.Write(res);
}

     首先,get()函数用async关键子修饰,表明这个函数是一个异步操作,在那里异步呢?

String res = await c.getStringAsync(url);

        HttpClient.getStringAsync(url) 异步地执行一个HttpGet操作,其返回一个Task<String> 而不是String,因此,await 表示等待Task<String> ,等好的东西就是String。因此,等到这个String的HttpGet结果后,就可以对结果进行操作了。那这个函数到底在哪里异步了呢?就是这个await关键字了,当这个函数被调用时,主线程执行到await语句之行都是串行执行到,而到了await语句后,程序就新开了一个线程来执行c.getStringAsync(url); 此时主线程就返回了。新线程执行完这个操作后就返回了HttpGet的结果,就是String 存放在变量res中,然后进行输出。所以,本质上来讲,await关键子就是帮你开了一个新线程执行后面的函数,然后返回一个Task<T>类型的东西,类型T就是串行时返回的东西。这个Console.Write(res);就相关于回调函数执行的内容了。所以,微软为广大C#程序员的美好生活而把创建线程,回调等等用两个关键子就搞定了。

        值得注意的是async关键子单独使用没有什么意义,没有实现异步,只有async配合await关键字一起使用才能真正起来异步的作用。

String res = await c.getStringAsync(url);
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值