代码改变世界

MVC对异步 Controller 的支持

2011-07-04 17:38  smat  阅读(1152)  评论(0编辑  收藏  举报

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

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