WEB开发网
开发学院WEB开发ASP.NET 在asp.net页面中使用异步读取 阅读

在asp.net页面中使用异步读取

 2006-09-21 17:15:26 来源:WEB开发网   
核心提示:刚亲自撰写一篇技术文章,请大家多指教,在asp.net页面中使用异步读取,哈哈,原文首发:http://bbs.5inet.net/topic.aspx?topicid=181有的时候我们需要在网页里读取论坛的信息,本程序就没有使用缓存之类的技术了,如有必要,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种

刚亲自撰写一篇技术文章,请大家多指教。哈哈。
原文首发:http://bbs.5inet.net/topic.aspx?topicid=181

有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。

要求:论坛需要提供rss支持。

代码如下:


   #region task class
   //这是一个任务类,执行具体的任务
   public class RssAsyncTask
   {
     PRivate String _rssContent;
     private AsyncTaskDelegate _dlgt;
     private string rssUrl;
     private bool _success;

   public bool IsSuccess
     {
       get
       {
         return _success;
       }
     }

   public RssAsyncTask(string rssUrl)
     {
       this.rssUrl = rssUrl;
     }

   // Create delegate.
     protected delegate void AsyncTaskDelegate();

   public String GetRssContent()
     {
       return _rssContent;
     }
     public void DoTheAsyncTask()
     {
       // Introduce an artificial delay to simulate a delayed
       // asynchronous task. Make this greater than the
       // AsyncTimeout property.
       WebClient wc = new WebClient();
       try
       {
         _rssContent = wc.DownloadString(rssUrl);
         _success = true;
       }
       catch (Exception e)
       {
         _rssContent = e.Message;
       }
       finally
       {
         wc.Dispose();
       }
       //Thread.Sleep(TimeSpan.FromSeconds(5.0));
     }

   // Define the method that will get called to
     // start the asynchronous task.
     public IAsyncResult OnBegin(object sender, EventArgs e,
       AsyncCallback cb, object extraData)
     {
       //_rssContent = "Beginning async task.";

     _dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
       IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);

     return result;
     }

   // Define the method that will get called when
     // the asynchronous task is ended.
     public void OnEnd(IAsyncResult ar)
     {
       //_rssContent = "Asynchronous task completed.";
       _dlgt.EndInvoke(ar);
     }

   // Define the method that will get called if the task
     // is not completed within the asynchronous timeout interval.
     public void OnTimeout(IAsyncResult ar)
     {
       _rssContent = "Ansynchronous task failed to complete " +
         "because it exceeded the AsyncTimeout parameter.";
     }
   }
   #endregion

   //一个自定义的控件,继承自另一个自定义控件。
   public class RArticle
     : LPanel
   {
     #region properties
     string rssUrl;

   public string RssUrl
     {
       get { return rssUrl; }
       set { rssUrl = value; }
     }

   int maxRecordNumber = 6;

   public int MaxRecordNumber
     {
       get { return maxRecordNumber; }
       set { maxRecordNumber = value; }
     }
     #endregion

   RssAsyncTask task;
     protected override void OnInit(EventArgs e)
     {
       base.OnInit(e);
       task = new RssAsyncTask(this.rssUrl);
       PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null);

     Page.RegisterAsyncTask(asyncTask);
       Page.ExecuteRegisteredAsyncTasks();
     }

   static Random r = new Random();
     protected override void Render(System.Web.UI.HtmlTextWriter writer)
     {
       string rssContent = task.GetRssContent();
       xmlDocument doc = null;
       if (task.IsSuccess)
       {
         doc = new XmlDocument();
         doc.LoadXml(rssContent);

       this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;
         this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
         this.ShowTitle = true;
       }
       base.RenderBegin(writer);

     writer.WriteBeginTag("div");
       writer.WriteAttribute("class", "child2");
       Right(writer);
       writer.WriteBeginTag("ul");
       Right(writer);

     if (doc != null)
       {
         #region success

       XmlNodeList items = doc.SelectNodes("rss/channel/item");
         List<XmlNode> nodes = new List<XmlNode>();
         foreach (XmlNode node in items)
           nodes.Add(node);

       //使用范型进行日期的倒序排列
         nodes.Sort(new Comparison<XmlNode>(delegate(XmlNode n1, XmlNode n2)
         {
           DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
           DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
           TimeSpan ts = d2 - d1;
           return (int)ts.TotalSeconds;
         }));

       for (int i = 0; i < maxRecordNumber; i++)
         {
           XmlNode node = nodes[i];
           writer.WriteBeginTag("li");
           Right(writer);
           writer.WriteBeginTag("a");
           writer.WriteAttribute("target", "_blank");
           writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
           Right(writer);
           writer.Write(node.SelectSingleNode("title").InnerText);
           writer.WriteEndTag("a");
           writer.WriteEndTag("li");
         }

       #endregion
       }
       else
       {
         writer.WriteBeginTag("pre");
         Right(writer);
         writer.Write(task.GetRssContent());
         writer.WriteEndTag("pre");
       }

     writer.WriteEndTag("ul");
       writer.WriteEndTag("div");

     RenderChildren(writer);

     base.RenderEnd(writer);
     }
   }
使用方法:
一、注册控件


<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
二、调用


<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl="http://bbs.5inet.net/rss.aspx" />
为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。

Tags:asp net 页面

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接