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服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...
随机推荐
- 应用360云盘与SVN版本管理服务器搭建基于云端的版本控制软件
步骤一:(安装软件) 1.TortoiseSVN 2.VisualSVN-Server-2.71 3.安装云盘客户端360wangpan_setup 步骤二:(VisualSVN Server设置) ...
- MySQL注入总结
SELECT first_name, last_name FROM users WHERE user_id = '$id' 1.id=1' or 1=1 -- 这个可以查询所有的信息,其中“- ...
- NIO组件Selector工作机制详解(上)
转自:http://blog.csdn.net/haoel/article/details/2224055 一. 前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但 ...
- TortoiseSVN搭建本地版本库及简单操作使用
TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...
- div页面居中(上下左右)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...
- Codeforces Beta Round #51 D. Beautiful numbers
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- [置顶] 提高生产力:开源Java工具包Jodd(Java的”瑞士军刀”)
官方网站:http://jodd.org/ 下载地址:http://jodd.org/download/index.html Jodd=tools + ioc + mvc + db + aop + t ...
- android 19 activity纵横屏切换的数据保存与恢复
Bundle类:竖屏的activity换到横屏的activity的时候,会把竖屏的activity杀掉横屏的activity创建,竖屏的activity会有一些计算结果,可以用数据存起来,存到内存里面 ...
- [转] 学习React Native必看的几个开源项目
http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe10057 ...
- Fragment的懒加载
我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在 ...