java 异步调用webapi_Async Await异步调用WebApi

先铺垫一些基础知识 在 .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(5000);

Console.WriteLine( "End downloading the page.." );

}

public static void LoadDatafromDB()

{

//TODO cost 5s

Console.WriteLine( "LoadDataFromDB on Thread:{0}", Thread.CurrentThread.ManagedThreadId);

Thread.Sleep(5000);

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(5000);

return repo.GetAll();

}

}

public class WidgetController : ApiController

{

public widgetRepo repo = new widgetRepo();

public IEnumerable< Widget> getWidgets()

{

Thread.Sleep(5000);

return repo.GetAll();

}

} 都是模拟耗时5秒钟,现在要同时调用这些api获得 数据并一起展示

public static List 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

5266be19b3f564955cf545a014cfbb9e.png    附上源代码  http://files.cnblogs.com/files/JasonShenW/WebApi.rar http://files.cnblogs.com/files/JasonShenW/WebMVC.rar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哲学家就餐问题python_哲学家就餐-同步问题解析-python

五个哲学家吃五盘通心粉&#xff0c;由于通心粉很滑&#xff0c;所以必须要拿起左右两边的叉子才能吃到。叉子的摆放如图所示。那么问题来了&#xff1a;能为每一个哲学家写一段描述其行为的程序&#xff0c;保证不会出现死锁。解法1:让他等待能够使用的时候&#xff0c;然后去…

java compare equla_Java中的equals,==,compareTo和compare的比较

Java中的equals(),,compareTo()和compare()首先只有可以用作两个基本类型数据之间的比较&#xff0c;当然是值比较。当用作两个对象比较时&#xff0c;比较的是对象引用&#xff0c;而不是值比较。其次任何对象都可以调用.equals()方法&#xff0c;因为这是从Object类继承下来的…

百度相关搜索软件_不太热门的办公神器软件篇搜索相关

这次介绍两个windows平台超好用的搜索神器——listary和everything全文阅读约需3分钟在工作中&#xff0c;虽然大部分文件都会分门别类地放在对应的文件夹中&#xff0c;但总有一些放完就忘了在哪或是层级过深打开不便的情况。这两个搜索神器完美地解决了找不到文件且windows自…

java摘要_java 摘要

packagecom.aarony.test;importjava.io.IOException;importjava.security.MessageDigest;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;public classDigestDemo {/**** 此方法描述的是&#xff1a;base64 解码**author: Aarony*version: 2018年6月20日 下午9:16…

python的装饰器、迭代器、yield_python装饰器,迭代器,生成器,协程

python装饰器[1]首先先明白以下两点#嵌套函数defout1():definner1():print(1234)inner1()#当没有加入inner时out()不会打印输出1234,当前层级也就是作用域下必须调用函数才能引用out1()#函数作用域defout2():a aaadefinner2():a bbbprint(a)inner2()print(a)out2()#当相同变量处…

jni c 传递对象到java_JNI将二进制数据从C传递到Java

我需要帮助将二进制数据传递给Java.我正在尝试使用jbytearray但是当数据进入Java时它看起来很糟糕.有人可以帮我一把吗&#xff1f;这是一些示例代码的片段.首先是原生C面&#xff1a;printf("Building audio array copy\n");jbyteArray rawAudioCopy env->NewBy…

python查看电脑配置_怎么查看电脑配置(教你如何查看电脑配置信息和型号)

如今&#xff0c;由于游戏、影音、学习或者工作的需要&#xff0c;用户都会有购买电脑的时候&#xff0c;不过对于一些不懂电脑的小白来说&#xff0c;如果连电脑配置都不会差的话&#xff0c;是十分容易被宰的。比如组装台式机的时候&#xff0c;可能一个不注意就被JS调包了&a…

mysql gtid深入_深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executedPREVIOUS GTID EVENT

之所以把MySQL.GTID_EXECUTED表的作用和PREVIOUS GTID EVENT的改变放到一起进行描述是因为它们后面文章探讨的基础。这部分使用到了我自己使用C语言写的原生BINLOG解析工具INFOBIN。一、GTID EVENT为什么要先描述什么是GTID EVENT呢&#xff1f;因为后面会用到&#xff0c;实际…

mysql 回滚段_MySQL和PostgreSQL比较

1、MySQL相对来说比较年轻&#xff0c;首度出现在1994年。它声称自己是最流行的开源数据库。MySQL就是LAMP(用于Web开发的软件包&#xff0c;包括 Linux、Apache及Perl/PHP/Python)中的M。构建在LAMP栈之上的大多数应用都会使用MySQL&#xff0c;包括那些知名的应用&#xff0c…

java应用程序多态_java – 多态和n层应用程序

这是一个很好的问题.这里有不止一个似是而非的方法;你必须平衡权衡,做出适合你情况的选择.(1)有些人会认为Document接口应该为实例提供一个自己呈现的方法.这从OO的角度来看是有吸引力的,但是根据您的观点技术,加载您的具体文档类(可能是简单的域模型类),具有JSP,Swing组件或其…

支持向量机python实例_Python机器学习SVM简单应用实例 | kTWO-个人博客

1、前言在上一篇理论性的文章中我们说过了&#xff0c;SVM是分线性可分和线性不可分两种情况的&#xff0c;线性可分的比较容易理解&#xff0c;比较容易一些&#xff0c;线性不可分的就稍微复杂一点了。我们测试就分别用线性可分和线性不可分两种情况分别测试Python中的SVM算法…

dbscan java_DBSCAN算法的Java,C++,Python实现

最近由于要实现‘基于网格的DBSCAN算法’&#xff0c;网上有没有找到现成的代码[如果您有代码&#xff0c;麻烦联系我]&#xff0c;只好参考已有的DBSCAN算法的实现。先从网上随便找了几篇放这儿&#xff0c;之后对比研究。DBSCAN简介&#xff1a;1.简介DBSCAN 算法是一种基于密…

python云计算主要是干嘛的_国内python 云计算是干什么的

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":6,"count":6}]},"card":[{"des":"云服务器 ECS(Elastic Compute Service)是一…

python画pr曲线代码_Yolov3测试图及绘制PR曲线,yoloV3,map,和,画

训练指令&#xff1a;./darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 | tee train_yolov3.logps&#xff1a;For training with mAP (mean average precisions) calculation for each 4 Epochs (set validvalid.txt or train.txt in obj.data fil…

xampp 支持pdo mysql_在Windows上安装PHP PDO(xampp)

我正在尝试开发一个可以在PHP上连接到尽可能多的不同数据库的Web应用程序. PDO(http://www.php.net/manual/en/book.pdo.php)似乎是正确的界面,但我无法安装所需要的所有不同PDO数据库驱动程序所需的扩展.请注意,我在Windows 7机器上使用xampp. PHP版本5.3.8. PDO驱动启用了Mys…

python常用的库有哪些餐厅_这十个Python常用库,学习Python的你必须要知道!

想知道Python取得如此巨大成功的原因吗&#xff1f;只要看看Python提供的大量库就知道了包括原生库和第三方库。不过&#xff0c;有这么多Python库&#xff0c;有些库得不到应有的关注也就不足为奇了。此外&#xff0c;只在一个领域里的工作的人并不知道另一个领域里有什么好东…

java将图片转byte存入数据库_Java将byte[]转图片存储到本地的案例

Java中&#xff0c;将字节数组转成图片的有很多种方式&#xff0c;今天在这里记录其中一种&#xff0c;方便以后查询&#xff0c;也可以提供给没有接触的童鞋做一个参考。首先是将图片转成字节数组import sun.misc.BASE64Encoder;import java.io.*;// 传入图片路径&#xff0c;…

python高阶函数看不懂_Python进阶:高阶函数的详细说明

这篇文章讲述了Python进阶&#xff1a;高阶函数的详细说明有需要的朋友可以参考函数式编程函数是Python内建支持的一种封装&#xff0c;我们通过把大段代码拆成函数&#xff0c;通过一层一层的函数调用&#xff0c;就可以把复杂任务分解成简单的任务&#xff0c;这种分解可以称…

java callable接口_Java多线程之Callable接口的实现有返回值的线程

import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;//在主线程获取callable线程返回值时&#xff0c;如果callable线程还存在线程没有执行完&#xff0c;则主线程…

python聊天软件实现_python实现点对点聊天程序

用Python实现点对点的聊天&#xff0c;2个程序&#xff0c;一个是client.py&#xff0c;一个是server.py&#xff0c;通过本机地址127.0.0.1连接进行通信&#xff0c;利用多线程把发送消息和接收消息分开独立进行。client代码&#xff1a;import socketimport sysimport thread…