我的朦胧讲解,希望有更好的见解!
异步 Controller
1、需要继承基类 AsyncController
2、在 Async 为后缀的方法中写发起异步操作的逻辑;在 Completed 为后缀的方法中写异步操作完成后的逻辑;此两个方法的前缀就是这个异步 Controller 的 Action
3、AsyncManager.OutstandingOperations.Increment() - 递增当前异步操作的计数器;AsyncManager.OutstandingOperations.Decrement(); - 递减当前异步操作的计数器。当异步操作的计数器为 0 时,则调用以 Completed 为后缀的方法
4、AsyncManager.Parameters[key] - 传递指定参数到以 Completed 为后缀的方法中
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();
}
}
}
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 " ])
{ %>
< a href ="<%= item.Id %>" >
<% = item.Title.Text %> </ a >< br />
<% } %>
</ div >
</ div >
</ body >
</ html >
<% @ 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 " ])
{ %>
< a href ="<%= item.Id %>" >
<% = item.Title.Text %> </ a >< br />
<% } %>
</ div >
</ div >
</ body >
</ html >