MVC对异步 Controller 的支持

我的朦胧讲解,希望有更好的见解!

异步 Controller 

1、需要继承基类 AsyncController
2、在 Async 为后缀的方法中写发起异步操作的逻辑;在 Completed 为后缀的方法中写异步操作完成后的逻辑;此两个方法的前缀就是这个异步 Controller 的 Action
3、AsyncManager.OutstandingOperations.Increment() - 递增当前异步操作的计数器;AsyncManager.OutstandingOperations.Decrement(); - 递减当前异步操作的计数器。当异步操作的计数器为 0 时,则调用以 Completed 为后缀的方法

4、AsyncManager.Parameters[key] - 传递指定参数到以 Completed 为后缀的方法中 

Controllers: 
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.Mvc;
using  System.Net;
using  System.Xml;
using  System.ServiceModel.Syndication;

namespace  MVC.Areas.AsynchronousController.Controllers
{
    [HandleError]
    
public   class  HomeController : AsyncController
    {
        
//  IndexAsync() 以及 IndexCompleted() 是一对,其 Action 为 Index
        
//  开始一个异步操作
         public   void  IndexAsync()
        {
            
//  递增计数器
            AsyncManager.OutstandingOperations.Increment();

            HttpWebRequest request 
=  (HttpWebRequest)WebRequest.Create( " http://www.cnblogs.com/lizhao/rss " );
            request.BeginGetResponse(
new  AsyncCallback(OnGetRssFeedAsyncCompleted), request);
        }

        
//  完成异步操作后
         public  ActionResult IndexCompleted(IEnumerable < SyndicationItem >  items)
        {
            ViewData[
" Message " =   " Welcome to ASP.NET MVC! " ;
            ViewData[
" SyndicationItems " =  items;
            
return  View();
        }
        
private   void  OnGetRssFeedAsyncCompleted(IAsyncResult result)
        {
            HttpWebRequest request 
=  (HttpWebRequest)result.AsyncState;
            HttpWebResponse response 
=  (HttpWebResponse)request.EndGetResponse(result);

            
using  (XmlReader reader  =  XmlReader.Create(response.GetResponseStream()))
            {
                SyndicationFeed feed 
=  SyndicationFeed.Load(reader);

                
//  传递指定参数到 IndexCompleted() 方法中
                AsyncManager.Parameters[ " items " =  feed.Items;

                
//  递减计数器,当计数器为 0 时,则调用 IndexCompleted()
                AsyncManager.OutstandingOperations.Decrement();
            }
        }
    }

} 

页面:

 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<% @ Import Namespace = " System.ServiceModel.Syndication "   %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  runat ="server" >
    
< title > Index </ title >
</ head >
< body >
    
< div >
        
< h2 >
            
<% : ViewData[ " Message " %> </ h2 >
        
< div >
            
<!--
                调用异步 Controller 的 Demo
                注意:Inherits="System.Web.Mvc.ViewPage<dynamic>",这里用了 dynamic 类型
            
-->
            
<%  foreach (SyndicationItem item in (IEnumerable < SyndicationItem > )ViewData[ " SyndicationItems " ])
               { 
%>
            
< href ="<%= item.Id %>" >
                
<% =  item.Title.Text  %> </ a >< br  />
            
<%  }  %>
        
</ div >
    
</ div >
</ body >
</ html >

 

转载于:https://www.cnblogs.com/lizhao/archive/2011/07/04/2097620.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值