MVC对异步 Controller 的支持

本文介绍 ASP.NET MVC 中使用异步 Controller 的实现方法。通过继承 AsyncController 并利用 IndexAsync 和 IndexCompleted 方法,可以有效地进行异步操作。示例展示了如何发起异步请求获取 RSS 订阅源,并在完成时更新视图。

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

异步 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值