在ASP.NET MVC中使用异步是比较麻烦的,从RC1版开始ASP.NET MVC Futures中提供了几个支持异步的类。

相关的类有:AsyncActionDescriptor、AsyncController、AsyncControllerActionInvoker、AsyncManager、AsyncResultWrapper、AsyncTimeoutAttribute、NoAsyncTimeoutAttribute。

相关接口有:IAsyncActionDescriptor、IAsyncActionInvoker、IAsyncController、IAsyncManagerContainer。

下面讲解一下怎么用它们

一、使用异步Action前的准备工作

1.引用Microsoft.Web.Mvc。

2.先要将要异步处理的Url交由MvcHttpAsyncHandler处理,这一步可以由AsyncRouteCollectionExtensions.MapAsyncRoute来设置规则,将原MapRoute处理的规则改为MapAsyncRoute,如:

routes.MapAsyncRoute(
 
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );

3.将相应的Controller继承于AsyncController。

public class HomeController : AsyncController    {    }

4.我们约定以下定义的Action都在HomeController中

二、第一种异步Action方式:Action、ActionCompleted方式

ASP.NET MVC Futures支持按名称自动寻找异步Action的方法

其使用方法为:

public void Async1(){

//主线程
           
        }
       
        public ActionResult Async1Completed(){
       
            //自动寻找与主线程 Action名称+Completed 的Action 做为异步Action
           
            return Content("Async1");}

三、第二种异步Action方式:BeginAction、EndAction方式

如果第一种方式你了解了的话第二种自然也不在话下,不过这种方式是与其它类的异步调用一起使用。

public delegate void AsyncEventHandler();//这里声明了一个委托,//也可使用
  
WebRequest/WebResponse/SqlConnection来实现这个异步过程
  
        public void Event1(){}
       
        public IAsyncResult BeginAsync3(AsyncCallback callback, object state){
       
           AsyncEventHandler asy = new AsyncEventHandler(Event1);
          
            ViewData["a"]=asy;//这里在方法間传值必须使用辅助存储对象,第一种方法中也是一样
            return asy.BeginInvoke(callback, state);
           
        }
       
        public void EndAsync3(IAsyncResult result){
       
//转到异步的Action中

var a = ViewData["a"] as AsyncEventHandler;
           
            a.EndInvoke(result);
           
            Content("完成").ExecuteResult(this.ControllerContext);
        }

四、第三种异步Action方式:使用AsyncManager.RegisterTask及委托

如果感觉上面使用2个方法才能实现异步Action有些麻烦的话(也的确是麻烦),可以使用AsyncManager.RegisterTask来调用委托来实现异步调用。

public void  Async2(){

this.AsyncManager.RegisterTask(c => {
           
                //主线程,调用异步线程
               
                c(null);
               
            }, delegate(IAsyncResult result) {
           
                //异步部分   
                          
                Content("Async2").ExecuteResult(this.ControllerContext);
               
            });
           
        }

其实无论是哪种方法都感觉不太完美,我个人觉得Action/ActionCompleted的方法可能更优美一点,适合一般使用(只是这三个比较)。只是AsyncManager.RegisterTask的方法传值方便一点,而Begin/End方法更适合与其它异步的操作配合。

转载于:https://www.cnblogs.com/webnet/archive/2009/03/22/1418807.html

使用ASP.NET MVC Futures 中的异步Action相关推荐

  1. 使用ASP.NET MVC Futures 中的异步Action 【转】

    之前看过老赵这两篇文章.也研究了一下老赵异步的实现方式. 不过感觉自己扩展的话,在ASP.NET MVC中使用异步还真是麻烦,刚好看到从RC1版开始 ASP.NET MVC Futures中提供了几个 ...

  2. ASP.NET MVC什么时候使用异步Action

    在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() { CustomerHelper cHelper = new Custom ...

  3. 【初学者指南】在ASP.NET MVC 5中创建GridView

    介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...

  4. 关于ASP.NET MVC P5中CheckBox的HtmlHelper方法的bug。

    在ASP.NET MVC P5中,当你使用这样的方法输出CheckBox:<%=Html.CheckBox("checkTest")%>,在浏览器上除了你期望看到的代码 ...

  5. 在ASP.NET MVC应用中开发插件框架(中英对照)

    [原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I'v ...

  6. 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面

    使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面 使用Donut Caching和Donut Hole Caching在ASP.NET MVC ...

  7. 在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图

    在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图 前提介绍 这个文章我们要讨论,在ASP.NET MVC模型的项目中,怎么选择一个最有效的方式来将多个数据模型(m ...

  8. ASP.net mvc开发中使用纯html如何创建FCKeditor编辑器的使用

    http://www.cnblogs.com/esshs/archive/2008/12/03/1346326.html FCKeditor下载路径: http://sourceforge.net/p ...

  9. 在ASP.NET MVC 4中使用Kendo UI Grid

    Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu .Grid .Combox等...), 底层以Html5 + jQuery ...

最新文章

  1. @angular/compiler-cli@4.3.6 requires typescript@'=2.1.0 2.4.0' but 2.5.2 was found instead.
  2. mac+php7+mysql.so_在Mac上编译安装PHP7的开发环境
  3. vijos1237-隐形的翅膀【离散化】
  4. 何必言精通——十年杂感
  5. ElasticSearch快速入门三(curl命令讲解)
  6. 【转】POSIX 是什么?让我们听听 Richard Stallman 的诠释 | Linux 中国
  7. docker 安装mysql_安装docker并使用docker安装mysql
  8. Best Efforts 1PC 跨库事务
  9. 电路——I/O口定时翻转电平驱动蜂鸣器注意事项
  10. 【2018蓝桥省赛A组C/C++】倍数问题(dp+滚动数组)
  11. mysql中regexp用法_mysql 中查询语句表达式REGEXP用法
  12. MD5详解(校验文件完整性)
  13. 基于51单片机ADC0808自动数字电压表仿真数码管显示
  14. interspeech2021论文集下载地址
  15. MaaS在绽放,为人们提供出行自由:过渡到新的范式
  16. 分享一个能对java代码进行“tokenize”的python库
  17. 职场新人收集的前辈经验
  18. 李丰新年展望 | 一张图看清2020中国机会
  19. python批量生成word_实例5:用Python批量生成word版邀请函
  20. c语言二级的作用是什么,c语言二级模拟考试

热门文章

  1. DIP第一章习题解答
  2. mysql6.0.7_MySQL Workbench v6.0.7 正式版
  3. Java爬虫https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书
  4. 常见的HTML元素及常见检查点
  5. PythonTip(2)
  6. jenkins创建job不能用中文问题
  7. CSS 外边距(margin)重叠及防止方法
  8. VIM基础130命令
  9. Linux硬链接 软链接
  10. codeplex网站翻译