手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

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

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

刚亲自撰写一篇技术文章,请大家多指教。哈哈。
原文首发: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);

//使用范型进行日期的倒序排列

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!