先铺垫一些基础知识

在 .net 4.5中出现了 Async Await关键字,配合之前版本的Task 来使得开发异步程序更为简单易控。
 
在使用它们之前 我们先关心下 为什么要使用它们。好比 一个人做几件事,那他得一件一件的做完,而如果添加几个人手一起帮着做
很显然任务会更快的做好。这就是并行的粗浅含义。
 
在程序中,常见的性能瓶颈在于 NetWork I/O 瓶颈 , CPU 瓶颈, 数据库I/O瓶颈,这些瓶颈使得我们的程序运行的很慢,我们想办法去优化。因为并行开发本身就加重CPU负担,所以一般将并行用来优化 由另外两种I/O造成的瓶颈。
//sync method sample
public static void DownLoadWebPage()
{
//TODO cost 5s
Console.WriteLine( "DownLoadWebPage on Thread:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
Console.WriteLine( "End downloading the page.." );
} public static void LoadDatafromDB()
{
//TODO cost 5s
Console.WriteLine( "LoadDataFromDB on Thread:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
Console.WriteLine( "End loading Data.." );
}
比如这边的两个方法, 通过Thread.Sleep来模拟程序耗时5秒,那如果我们再写一个方法来调用
   public static void OurSyncJob()
{
Console.WriteLine( "start doing things sync" );
DownLoadWebPage();
LoadDatafromDB();
//do some other things
Console.WriteLine( "do some other things" );
}
很显然 会耗时超过10s钟,如果我们用task开启两个线程 同时执行 如下
       public static async Task OurAsyncJobTask()
{
Console.WriteLine( "start doing things async" );
var taskA= Task.Run(() => { DownLoadWebPage(); });
var taskB= Task.Run(() => { LoadDatafromDB(); });
await Task.WhenAll(taskA,taskB);
Console.WriteLine( "do some other things" );
}
那执行时间只会是5s多一点, 大大提升了我们程序的性能。
 
在了解了这些基础之后,我们来接触异步程序的实际运用场景。
我们调用 WebApi的时候,因为要经过网络传输,有时候会很慢。 这时候便有了我们用异步一展身手的时候了。
我们的webapi如下
    public class ProductController : ApiController
{
public productRepo repo = new productRepo();
public IEnumerable< Product> getProducts()
{
Thread.Sleep();
return repo.GetAll();
}
}
public class WidgetController : ApiController
{
public widgetRepo repo = new widgetRepo();
public IEnumerable< Widget> getWidgets()
{
Thread.Sleep();
return repo.GetAll();
}
}
都是模拟耗时5秒钟,现在要同时调用这些api获得 数据并一起展示
    public static List <Product > TaskGetProduct()
{
using( HttpClient client= new HttpClient())
{
client.BaseAddress = new Uri( "http://localhost:52593/" );
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue ("application/json" ));
string json = client.GetString("api/Product/Products" );
return JsonConvert.DeserializeObject< List< Product>>(json);
}
}
很显然 调用这个webapi要5秒多,那么我们要同时获取的时候,就要分别调用TaskGetProduct() TaskGetWidget() TaskGetGizmos()
和前面的经验一样,这要是同步的话不得15秒多。。这要如何忍受。。
很显然要异步获取
public static async Task< List< Product>> TaskGetProduct()
{
using( HttpClient client= new HttpClient())
{
client.BaseAddress = new Uri( "http://localhost:52593/" );
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue ("application/json" ));
string json = await client.GetStringAsync("api/Product/Products" );
return JsonConvert.DeserializeObject< List< Product>>(json);
}
} public static async Task< pwgVM> RunTaskGetAll()
{
var task1 = TaskGetItem< Product>();
var task2 = TaskGetItem< Gizmos>();
var task3 = TaskGetItem< Widget>();
await Task.WhenAll(task1,task2,task3);
pwgVM vm = new pwgVM(task1.Result,task2.Result,task3.Result);
return vm;
}
三个任务同时进行,花费5秒多。ok
 
 附上源代码 
http://files.cnblogs.com/files/JasonShenW/WebApi.rar
http://files.cnblogs.com/files/JasonShenW/WebMVC.rar
 

Async Await异步调用WebApi的更多相关文章

  1. .NET Web应用中为什么要使用async/await异步编程

    前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...

  2. 【转】C# Async/Await 异步编程中的最佳做法

    Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...

  3. 将 async/await 异步代码转换为安全的不会死锁的同步代码

    在 async/await 异步模型(即 TAP Task-based Asynchronous Pattern)出现以前,有大量的同步代码存在于代码库中,以至于这些代码全部迁移到 async/awa ...

  4. C#中 Thread,Task,Async/Await 异步编程

    什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...

  5. spring boot中使用@Async实现异步调用任务

    本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...

  6. async/await异步处理demo

    async/await异步处理demo 下载地址: async/await异步处理demo

  7. spring boot 学习(十一)使用@Async实现异步调用

    使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...

  8. Spring Boot使用@Async实现异步调用

    原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameRes ...

  9. 深入理解协程(四):async/await异步爬虫实战

    本文目录: 同步方式爬取博客标题 async/await异步爬取博客标题 本片为深入理解协程系列文章的补充. 你将会在从本文中了解到:async/await如何运用的实际的爬虫中. 案例 从CSDN上 ...

随机推荐

  1. AJPFX:什么是止盈?什么是止损?

    在您进行外汇交易后,会碰到Take Profit(止盈)和 Stop Loss(止损)这两个词,均是用作控制风险的工具. 止盈(Take Profit):当单子达到预期的获利价格时锁定盈利.当订单在盈 ...

  2. OCP考试062题库出现大量新题-18

    choose two Examine this command executed on a client that is remote from the database server. SQL> ...

  3. 协程 coroutine

    参考链接: http://manual.luaer.cn/2.11.html http://www.cnblogs.com/riceball/archive/2008/01/03/1025158.ht ...

  4. Python MySQL - 进行数据查询

    #coding=utf-8 import mysql.connector import importlib import sys # reload(sys) # sys.setdefaultencod ...

  5. <compilation debug="true" targetFramework="4.5"> 报错解决方案

    在 VS2013 下开发的 MVC4 网站,基于 .net 4.5,服务器是一台 Windows 2008 R2,运行的时候就报错了 The 'targetFramework' attribute i ...

  6. Docker - 基础讲义

    Docker Docker - 官网 Docker - Hub GitHub - Docker dockerinfo Docker中文社区 Docker入门教程 Docker从入门到实践 虚拟化技术 ...

  7. eclipse安装STS遇到的问题

    eclipse安装STS时,在eclipse marketplase中搜索STS没有结果,从官网下载STS包,然后安装提示找不到JAR包, 解决方式: eclipse需要和STS包版本一致,如果STS ...

  8. editplus来编写html

    本来写这篇文章,我可以有很多废话,但是很多都过去了,言而总之下:我暂且给这个方法起个名字,叫做“为之法”,因为有了这篇文章,很多人的想法会豁然开朗,那样有了个名字交流传阅起来就方便多了. 本方法依托于 ...

  9. c++如何解决大数组栈内存不够的问题

    在c++中,我们可以直接通过下面的方式创建一个数组: ; ; ; double phi[N][Nx][Ny]; double phi_b[N][Nx][Ny]; 但是,如果上述的Nx和Ny比较小还好说 ...

  10. Android的几种弹出框

    项目效果图: 新建一个项目,结构图如下所示: activity_main.xml: <?xml version="1.0" encoding="utf-8" ...