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

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:09:33
字體:
來源:轉載
供稿:網友

有的時候我們需要在網頁里讀取論壇的信息,在傳統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" />

為了簡便起見,本程序就沒有使用緩存之類的技術了,如有必要,請自行添加。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巫山县| 鄂伦春自治旗| 宽甸| 澎湖县| 电白县| 澄江县| 庄河市| 泽库县| 临夏县| 新蔡县| 北安市| 海原县| 峡江县| 雅江县| 盐源县| 蓬莱市| 和平县| 措勤县| 法库县| 托克逊县| 武城县| 马山县| 无锡市| 庆安县| 营口市| 北宁市| 自贡市| 崇阳县| 方正县| 固原市| 东源县| 司法| 夏邑县| 开原市| 田林县| 台中市| 黑水县| 定边县| 文山县| 通许县| 溧阳市|