Aspnet MVC 异步调用
一个简图来描述下Aspnet MVC下的异步调用
{ request }
/ \/
-------ISS------- > work thread
| \
| \ route - aysn controller
| \
| \ [invoke] clr thread pool
| /
| /
| / complete -> asyncManager
| /
|------asyncManager
从简图可以了解:
用户发送请求,服务器路由到控制器,控制器到action,action内部通过线程池调用新线程执行request,然后将数据返回给用户。
该简图涉及到controller的一个属性AsyncManager
asyncManagerde的作用主要体现在两点:
1. 标识异步的开始和结束,通 过 AsyncManager.OutstandingOperations.Increment/OutstandingOperations.Decrement
2. 在执行线程到结束回调过程中的参数传递 通过AsyncManager.Parameters (类型为字典,传递参数时候需要注意Key需要跟结果参数回调的参数名一致)。
asyncManager在异步调用中并不是必须的。
异步虽好,但并不是所有的场合都是适合的,一般来说如果没有长耗时和分布的需求情况下,异步是没要的
在aspnet mvc中实现异步操作有三种方式:
1.通过异步控制器AsyncController
自定义控制器通过继承AsyncController,在内部定义XXXAsync/XXXCompleted格式的action,例如:
public void IndexAsync() { }
public ActionResult IndexCompleted(string parameter);
//其中indexCompleted中的参数parameter
//通过AsyncManager.Parameters ["parameter'] = XX传递
//参数名和KEY要保持一致性
Async和completed定义总是成对出现了,async定义的方法用于执行异步操作,而completed定义的方法用于返回结果.
通过XXasync和XXcompeleted定义的方法,ASPNET MVC在调用时候并不是以异步的方式调用,所以真正的工作还是需要我们自己async中定义异步操作.一个简单的例子:
public class CustomAsyncController: AsyncController
{
public void IndexAsync() {
//increment不写参数情况默认计数为1
//如果存在多个task需要添加相应的计数值,以保证结果能正确的返回
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(() =>
{
int sum = ;
for (int i = ; i < ; i++) { sum += i; } //传递参数给XXXCompleted
AsyncManager.Parameters["sum"] = sum; //end
AsyncManager.OutstandingOperations.Decrement();//多个任务要多次调用,调用次数一般等于increment中设置的计数
}); }
public ActionResult IndexCompleted(string sum)
{
return Content(sum.ToString());
}
}
2.通过async和await关键字
async/await关键字用于标识异步操作,我们用一个简单的例子来演示async/await的使用
a.例子我们先定义个webapi,用于返回用户信息
b.通过服务类,异步调用改用webapi接口返回用户信息
c.控制器调用服务类返回数据结果
public class UserController : ApiController
{
private static UserRepository _respository = new UserRepository(); [System.Web.Http.HttpGet]
public IList<UserModel> GetAll()
{
return _respository.GetAll();
}
}
public class UserService
{
private static UserService instance = null;
public static UserService Instance
{
get
{
if (instance == null)
instance = new UserService(); return instance;
}
}
public async Task<IList<UserModel>> GetUsersAsync( CancellationToken token =default(CancellationToken))
{
var uri = "http://localhost:3541/api/user/getall";
using(HttpClient client = new HttpClient())
{
var response = await client.GetAsync(uri);
return await response.Content.ReadAsAsync<IList<UserModel>>();
}
}
}
public class CustomController : Controller
{
public async Task<ActionResult> Index()
{
IList < UserModel > models = await UserService.Instance.GetUsersAsync(); return Json(models,JsonRequestBehavior.AllowGet);
}
}
3.直接通过返回task实现异步
最简单最直接的一种方式了
public class HomeController : AsyncController
{
public Task<ActionResult> Index()
{
return Task.Factory.StartNew(() =>
{
return new List<UserModel>
{
new UserModel {Name ="visonme" },
new UserModel {Name = "visonme2" }
};
}).ContinueWith<ActionResult>((task) =>
{
return Json(task.Result, JsonRequestBehavior.AllowGet);
});
}
}
Aspnet MVC 异步调用的更多相关文章
- [MVC] - 异步调用后台的常用方法。
1. 直接调用Action @Html.Action("GetTopArticle", "Home") 2. 通过url, 并用Jquery异步加载. < ...
- MVC 异步调用
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- Spring MVC 异步处理请求,提高程序性能
原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能? 一个普通 Servle ...
- mvc路由引起异步调用web服务的问题
从一篇blog得知使用脚本可以异步调用Web服务,觉得很新鲜,因为自己很少用到Web服务,所以决定写一写看看什么效果. 首先在UI项目(我使用的是MVC4.0)里创建一个Web服务. 添加Web服务后 ...
- 【ASP.Net MVC】AspNet Mvc一些总结
AspNet Mvc一些总结 RestaurantReview.cs using System; using System.Collections.Generic; using System.Comp ...
- AspNet MVC中各种上下文理解
0 前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...
- ASPNET MVC中断请求
ASPNET MVC如何正确的中断请求? 感觉是这样? 在aspnet开发过程中如果想要中断当前的http处理,以前在aspnet中一直是Response.End(); 在这Response.End( ...
- AspNet MVC : 操作/控制器过滤器(action filter)
1.Action Filter Action Filter提供了在执行action/controller前后对请求/响应修改的能力,可以应用于action和控制器上,作用在控制器上将自动被应用到该控制 ...
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...
随机推荐
- Oracle设计规范!
Oracle设计规范! 一哥们整理的Oracle的设计规范,相当的不错,贴这以备后续之需! 目录 1.数据库模型设计方法规范 1.1.数据建模原则性规范 1.2.实体型之间关系认定规范 1.3.范式化 ...
- Add external tool in the Android Studio
Add external tool in the Android Studio */--> pre { background-color: #2f4f4f;line-height: 1.6; F ...
- hdu 4465 Candy(二次项概率)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4465 参考博客:http://www.cnblogs.com/goagain/archive/2012 ...
- 部署war包到Tomcat
1. 开发给到一个war包,假设叫 a-b-c.war. 2. 打开Tomcat安装路径 ,假设是“D:\Tomcat\apache-tomcat-7.0.68”,然后进入到 webapps文件夹. ...
- Redis教程02——管道(Pipelining)
请求/响应协议和RTT Redis是一个使用客户端/服务器模型(也被称作请求/响应协议)的TCP服务器. 这说明通常来讲一个一个请求的实现有以下步骤: 客户端发送请求到服务器,并从socket中以堵塞 ...
- UVaLive4043 UVa1411 Ants 巨人与鬼
题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的 ...
- bzoj3065: 带插入区间K小值
无聊来写了下 一开始发现树高是O(n)的,然后就MLE了,进去看了下发现没有重构! 看了半天发现调用错了函数 然后进去又发现不满足sz = ch[0]->sz + ch[1]->sz + ...
- [转]PHP100视频教程(2012-2013版)下载地址及密码
[转] PHP100视频教程(2012-2013版) 下载地址及其密码 先记起来,不用再到处找密码了. NO 名称 下载地址 密码 1 [第01讲]开启PHP学习之路,融入新互联网时代 http:/ ...
- [转]Android中dp,px,sp概念梳理以及如何做到屏幕适配
http://blog.csdn.net/jiangwei0910410003/article/details/40509571 今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI ...
- struts 2学习笔记—浅谈struts的线程安全
Sruts 2工作流程: Struts 1中所有的Action都只有一个实例,该Action实例会被反复使用.通过上面Struts 2 的工作流程的红色字体部分我们可以清楚看到Struts 2中每个A ...