zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Delphi中Chrome Chromium、Cef3学习笔记(五)
    java ->IO流_File类
    java ->递归
    java-> 分包分层
    java ->JDBC
    java -> 异常类与自定义异常
    java ->斗地主洗牌
    java -> map接口
    java ->Set接口
    java -> List接口
  • 原文地址:https://www.cnblogs.com/lizhao/p/2097620.html
Copyright © 2011-2022 走看看