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服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...
随机推荐
- margin设置为负数
1.为负margin“平反” 我们在CSS中都会使用margin,但将margin设置成负数,那可能就不大好处理了.在网页设计中,人们对负margin用法的态度大相径庭,有的人非常喜欢,而有的人则认为 ...
- openstack grizzly版network网络节点安装
版本以及源的配置和控制节点一致 1.安装完操作系统已经apt源配置完成之后,一定要执行 apt-get update root@cloud:~# mv /etc/apt/sources.list /e ...
- 还原dede数据后系统基本参数空白栏目无显示的解决方法
有时dedecms开发的网站在更换空间还原数据后,出现"系统基本参数"空白,而且可以看到tag也没有了. 大家不妨看看后台"数据库备份/还原"处,已经还原后的表 ...
- Away3D 的实体收集器流程1
View3D 顾名思义 它就是一个3D视口,视口的默认值是无穷大的,即相当于“窗口”是无限大的,我们看到的将是外面的所有景物即flash尺寸是视口的有效视域.传统电视的高宽比为4:3,现在的高清电视的 ...
- C:\WINDOWS\system32\drivers\etc\hosts host文件夹里面的内容是什么?
这个文件是根据TCP/IP for Windows 的标准来工作的,它的作用是包含IP地址和Host name(主机名)的映射关系,是一个映射IP地址和Host name(主机名)的规定,规定要求每段 ...
- Android 官方文档:(二)应用清单 —— 2.2 <action>标签
syntax: <action android:name="string" /> contained in: <intent-filter> descrip ...
- 【MongoDB】在windows平台下mongodb的分片集群(五)
本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...
- POJ 3277 City Horizon
标题效果: 每间房子的长度给出阴影(在间隔代表)而高度,求阴影总面积. 解题思路:矩形面积并. 以下是代码: #include <set> #include <map> #in ...
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. ...
- Java基础知识强化14:Java死亡竞赛题目解析
一个小型网站上发布了一个称为Java“死亡竞赛”的新项目.测验发布后,超过20000位开发者参加了测验.网站以20道关于Java的多选题为主.我们得到了众多开发者的测验统计数据,今天,我们非常乐意 ...