国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在asp.net頁面中使用異步讀取

2019-11-18 16:58:47
字體:
來源:轉載
供稿:網友

剛親自撰寫一篇技術文章,請大家多指教。哈哈。
原文首發: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="為了簡便起見,本程序就沒有使用緩存之類的技術了,如有必要,請自行添加。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扎囊县| 红安县| 泰州市| 台州市| 田东县| 兴国县| 奈曼旗| 桂林市| 莎车县| 五峰| 巴林左旗| 姜堰市| 昌吉市| 上饶县| 普兰店市| 青浦区| 沂水县| 容城县| 太白县| 凌源市| 洪泽县| 轮台县| 宁晋县| 青田县| 涞源县| 夏津县| 句容市| 临清市| 房山区| 玛纳斯县| 泸定县| 三江| 仁怀市| 三江| 东兰县| 师宗县| 白城市| 仪征市| 友谊县| 宁晋县| 新平|