一个简图来描述下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 异步调用的更多相关文章

  1. [MVC] - 异步调用后台的常用方法。

    1. 直接调用Action @Html.Action("GetTopArticle", "Home") 2. 通过url, 并用Jquery异步加载. < ...

  2. MVC 异步调用

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  3. Spring MVC 异步处理请求,提高程序性能

    原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能? 一个普通 Servle ...

  4. mvc路由引起异步调用web服务的问题

    从一篇blog得知使用脚本可以异步调用Web服务,觉得很新鲜,因为自己很少用到Web服务,所以决定写一写看看什么效果. 首先在UI项目(我使用的是MVC4.0)里创建一个Web服务. 添加Web服务后 ...

  5. 【ASP.Net MVC】AspNet Mvc一些总结

    AspNet Mvc一些总结 RestaurantReview.cs using System; using System.Collections.Generic; using System.Comp ...

  6. AspNet MVC中各种上下文理解

    0  前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...

  7. ASPNET MVC中断请求

    ASPNET MVC如何正确的中断请求? 感觉是这样? 在aspnet开发过程中如果想要中断当前的http处理,以前在aspnet中一直是Response.End(); 在这Response.End( ...

  8. AspNet MVC : 操作/控制器过滤器(action filter)

    1.Action Filter Action Filter提供了在执行action/controller前后对请求/响应修改的能力,可以应用于action和控制器上,作用在控制器上将自动被应用到该控制 ...

  9. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

随机推荐

  1. 关于cocos2d和cocos2dx,还有iOS上的cocos2d的ARC问题

    好吧,我承认这个我花了N个小时所做的努力都白费了. 事情的开始是这样的,今天在写cocos2dx的时候,测试发现总是出现溢出的问题,总是在main.m的autorelease报错.(好吧,如果我以后发 ...

  2. mysql使用mysqldump导出数据出错

    mysqldump -hlocalhost -uroot -p123456 student_info jssypk  > c:/databackup.sql 导出表结构 mysqldump  - ...

  3. hdu 1010 dfs搜索

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. centos_6.7_系统初始化

    #!/bin/bash #****************************************************************# # ScriptName: acfunin ...

  5. appium api

    AppiumDriver getAppStrings()      默认系统语言对应的Strings.xml文件内的数据.iOS driver.getAppStrings(Stringlanguage ...

  6. SQL语法集锦一:SQL语句实现表的横向聚合

    本文转载:http://www.cnblogs.com/lxblog/archive/2012/09/29/2708128.html 问题描述:假如有一表结构和数据如下: C1 C2 C3 C4 C5 ...

  7. 《Linux Device Drivers》第十章 中断处理——note

    概述:系统要及时的感知硬件的状态,通常有两种方式:一种是轮询.一种是通过响应硬件中断.前者会浪费处理器的时间,而后者不会. 准备并口 在没有节设定产生中断之前,并口是不会产生中断的 并口的标准规定设置 ...

  8. 基于XMPP实现的Openfire的配置安装+Android客户端的实现

    最近在整理一些这方面的资料,闲话少说,咱还是直奔主题吧 :) 一.基于xmpp实现的openfire的配置安装 1. 下载最新的openfire安装文件 官方下载站点: http://www.igni ...

  9. 京东手机webapp商城

    http://bases.wanggou.com/mcoss/mportal/show?tabid=2&ptype=1&actid=1562&tpl=3&pi=1&am ...

  10. HUNNU--湖师大--11407--It Is Cold

    [F] It Is Cold Dr. Ziad Najem is known as the godfather of  the  ACPC. When the regional contest was ...