从抽象类Controller 的定义可以看出他 同时实现了 IAsyncController, IController

   public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
{
protected Controller();
}

IAsyncController 就表示异步。

通过属性 DisableAsyncSupport 属性来判断是同步还是异步执行  DisableAsyncSupport=true 表示同步 DisableAsyncSupport=false 表示异步。

但是即使执行BeginExecute/EndExecute 方法,Controller也不一定是 异步方式执行,如下代码片段。

public class HomeController : Controller
{
protected override bool DisableAsyncSupport
{
get { return false; }
} public new HttpResponse Response
{
get { return System.Web.HttpContext.Current.Response; }
} /// <summary>
/// 同步执行
/// </summary>
/// <param name="requestContext"></param>
protected override void Execute(RequestContext requestContext)
{
Response.Write("Execute(); <br/>");
base.Execute(requestContext);
} /// <summary>
/// 同步执行
/// </summary>
protected override void ExecuteCore()
{
Response.Write("ExecuteCore(); <br/>");
base.ExecuteCore();
} /// <summary>
/// 同步异步都会执行
/// </summary>
protected override IAsyncResult BeginExecute(RequestContext requestContext,
AsyncCallback callback, object state)
{
Response.Write("BeginExecute(); <br/>");
return base.BeginExecute(requestContext, callback, state);
} /// <summary>
/// 同步异步都会执行
/// </summary>
/// <param name="asyncResult"></param>
protected override void EndExecute(IAsyncResult asyncResult)
{
Response.Write("EndExecute(); <br/>");
base.EndExecute(asyncResult);
} /// <summary>
/// 异步执行
/// </summary>
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback,
object state)
{
Response.Write("BeginExecuteCore(); <br/>");
return base.BeginExecuteCore(callback, state);
} /// <summary>
/// 异步执行
/// </summary>
/// <param name="asyncResult"></param>
protected override void EndExecuteCore(IAsyncResult asyncResult)
{
Response.Write("EndExecuteCore(); <br/>");
base.EndExecuteCore(asyncResult);
} public ActionResult Index()
{
return Content("Index();<br/>");
}
}

Controller 还继承了一个IAsyncController 接口,这个异步接口并不是指 Controller 是否异步, 而是 Action 方法是否异步执行,在MVC4以前 Action 的异步是通过

定义XxxAsync/XxxCompleted 形式定义异步Action,新版本中为了兼容旧版 所以引用了IAsyncController

在4.0后 Action 通过返回Task的方式来定义是否异步执行Action。

ASP.NET mvc4 Controllder 同步还是异步的更多相关文章

  1. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  2. 异步多线程 ASP.NET 同步调用异步 使用Result产生死锁

    一个方法调用了async方法,要将这个方法本身设计为async. public class BlogController : Controller { public async Task<Act ...

  3. C# ASP.NET Core使用HttpClient的同步和异步请求

    引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...

  4. ASP.NET WebAPi(selfhost)之文件同步或异步上传

    前言 前面我们讲过利用AngularJs上传到WebAPi中进行处理,同时我们在MVC系列中讲过文件上传,本文结合MVC+WebAPi来进行文件的同步或者异步上传,顺便回顾下css和js,MVC作为客 ...

  5. Asp.Net MVC4新特性指南(2):新特性介绍

       上一章讲解了最基本的MVC4说明.今天就介绍下几种新特性的使用例子:   就当大家有MVC3的基础了.在这个基础上在看下面的介绍就容易多了.1.Web API MVC4包括一个更好的解决方案:A ...

  6. Asp.Net MVC4 + Oracle + EasyUI 学习 第二章

    Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...

  7. Asp.Net MVC4 + Oracle + EasyUI 学习 序章

    Asp.Net MVC4 + Oracle + EasyUI  序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1.  简 ...

  8. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...

随机推荐

  1. 读《分布式一致性原理》JAVA客户端API操作2

    创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...

  2. leetcode278

    /* The isBadVersion API is defined in the parent class VersionControl. bool IsBadVersion(int version ...

  3. Django中多种重定向方法使用

    本文主要讲解使用HttpResponseRedirect.redirect.reverse以及配置文件中配置URL等重定向方法 本文使用了Django1.8.2 使用场景,例如在表单一中提交数据后,需 ...

  4. Linux虚机密码破解

    1 重启机器,在机器读秒时按回车键 2 选择要启动的操作系统按 e 3 选择kernel所在行按 e 4 末尾输入空格  single 5 敲回车 在按 b 系统将进入单用户模式 然后 可以 通过 p ...

  5. js小功能

    1 删除左右两端的空格 //删除左右两端的空格 function trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 2 ...

  6. 03.什么是Lucene全文检索的原理01

    全文检索的原理:查询速度快,精准度高,可以根据相关度进行排序.它的原理是:先把内容分词,分词之后建索引. Lucene是apache下的一个开放源代码的全文检索引擎工具包. 提供了完整的查询引擎和索引 ...

  7. 【SPOJ - SUBLEX】Lexicographical Substring Search 【后缀自动机+dp】

    题意 给出一个字符串和q个询问,每个询问给出一个整数k,输出第k大得子串. 分析 建后缀自动机,利用匹配边来解决.设d[v]为从状态v开始有多少不同的路径.这个显然是可以递推出来的.然后对于每个询问, ...

  8. nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

    首先看 ngx_alloc.h 文件,主要声明或宏定义了 ngx_alloc,ngx_calloc,ngx_memalign,ngx_free. /* * Copyright (C) Igor Sys ...

  9. ICO流程,casestudy

    https://medium.com/crypto-oracle/ico-analysis-framework-nex-case-study-bf65586b4b32

  10. Redis中redis.conf里面配置详解

    是否将redis设置为守护程序,默认为no daemonize yes   如果设置为守护程序,需要指定pid文件 pidfile /var/run/redis/redis-server.pid   ...