All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
采用XHTML和CSS设计可重用可换肤的WEB站点_[Html教程]
MS,SQL数据库的连接处理解决方案_[SQL,Server教程]
SQL,SERVER内存会不断增加的问题分析_[SQL,Server教程]
PHP+MYSQL留言本(二)_[PHP教程]
常见PHP页面漏洞分析及相关问题解决_php资料_编程技术
visual c++中的错误处理
Ajax简单客户登陆验证_[Asp.Net教程]
Delphi触摸屏系统
Sql Server 2005 数据库维护计划_[SQL Server教程]
Repeater属性、方法和事件
Reading number is top 10 pictures
The household of rural style is designed
一个武林高手的故事
30 beautiful school beauty1
30 beautiful school beauty3
29 the belle stars after bath figure3
2012 national geographic daily picture5
This is heaven to some path
超强高考作文
Born After 90 Beijing sports university campus flower photos3
A man's favorite things4
Download software ranking
Take off clothes to survival
Tram sex maniac 2 (H) rar bag13
jdk1.5
Boxer's Top ten classic battle5
WebService在.NET中的实战应用教学视频 → 第1集
Tram sex maniac 2 (H) rar bag2
Unix video tutorial5
Sora aoi‘s film--Lust fan wall
虚拟机5.5.3版
Tram sex maniac 2 (H) rar bag19
delv published in(发表于) 2014/1/6 8:47:37 Edit(编辑)
ASP.NET,2.0,中使用自定义缓存依赖_[Asp.Net教程]

ASP.NET,2.0,中使用自定义缓存依赖_[Asp.Net教程]

ASP.NET 2.0 中使用自定义缓存依赖_[Asp.Net教程]























 在 ASP.NET 1.x 中,我们可以使用 CacheDependency 来实现缓存依赖策略,但由于这个类是 sealed 的,我们无法继承这个类来实现我们自己的策略。但是到了 ASP.NET 2.0,我们已经可以从这个类派生出自己的缓存依赖类了。


  假定我们要设计一个页面,需要从博客园首页获取最新的贴子信息。为了提高性能,我们希望页面数据仅当博客园首页有更新时才重新生成,否则的话就直接从缓存中获取。如何实现?




  一、设计 BlogCacheDependency 类




  先分析一下,首先,毫无疑问的,这个类应当从 CacheDependency 派生出来,然后它才能在 Cache 的 Insert 方法中使用,或者被用在 AggregateDependency 类中。




  其次,从博客园提供的 RSS 以及页面设计的角度考虑,可以在缓存中放置 RSS 数据,显示的时候使用一个样式转换。而在检查依赖性的时候,我们只需要简单地比较一下当前的 RSS 与网站的 RSS 是否相同就可以了。




  一个比较重要的问题是:我们何时去检查比较 RSS 数据?在每次请求的时候吗?显然不行,这样一来跟不使用缓存几乎没什么区别,甚至实际上加重了无谓的负担。考虑在没有请求的时候进行检查呢?我们可以使用一个 Timer 来控制,让它定期去检查一个是否有更新,如果有更新则通知依赖发生了改变。




  我们知道 CacheDependency 类有一个 HasChanged 属性,但是当 BlogCacheDependency 检查到依赖改变时如何告诉它的基类呢?这就是在 ASP.NET 2.0 中 CacheDependency 类中新增的 NotifyDependencyChanged 方法的使命了。




  此外为了便于重用,BlogCacheDependency 类须得有一个 feed 数据,用来保存我们要获取的 RSS 数据的 URL。还要有一个时间间隔,便于在使用的时候调整刷新速度。




  好,看看实际的实现代码:




1 public class BlogCacheDependency : CacheDependency
2 {
3 private Timer _tickTimer;
4 private int _timeInterval;
5 private XPathNavigator _rss;
6 private string _feed;
7
8 public XPathNavigator RSS
9 {
10 get
11 {
12 return _rss;
13 }
14 }
15
16 public BlogCacheDependency(string feed, int timeInterval)
17 {
18 _feed = feed;
19 _timeInterval = timeInterval;
20 _rss = GetRSS();
21 _tickTimer = new Timer(new TimerCallback(CheckDependencyCallback),
22 this, _timeInterval * 1000, _timeInterval * 1000);
23 }
24
25 private XPathNavigator GetRSS()
26 {
27 XPathDocument rssDoc = new XPathDocument(_feed);
28 return rssDoc.CreateNavigator();
29 }
30
31 public void CheckDependencyCallback(object sender)
32 {
33 BlogCacheDependency bcd = sender as BlogCacheDependency;
34 XPathNavigator newRSS = GetRSS();
35 if (newRSS.OuterXml != _rss.OuterXml)
36 {
37 bcd.NotifyDependencyChanged(bcd, EventArgs.Empty);
38 }
39 }
40
41 protected override void DependencyDispose()
42 {
43 _tickTimer = null;
44 base.DependencyDispose();
45 }
46}
47
48




  这里,BlogCacheDependency 的构造函数中使用 _tickTimer 实现了一个定时检查更新的机制,它根据设定的时间间隔去调用 CheckDependencyCallback 方法。




  而 CheckDependencyCallback 方法则将两个 RSS 信息进行比较,如果不同,则调用 NotifyDependencyChanged 方法通知基类,相应的缓存依赖已经发生了变化,缓存中的数据应当被清除。




  二、页面设计




  下面是页面代码(有删节),其中显示了 BlogCacheDependency 的使用方法:




1
19
20
21
22 博客园最新贴子:
23

24
25

26
27
28
29




  本例中设定的访问博客园首页最新贴子列表,时间间隔为600秒,即每10分钟检查一次更新情况。




  几个值得注意的地方:




  1、注意使用的 RssXml.XPathNavigator 属性,有人可能奇怪为什么不用 RssXml.Document 呢?实际上 Document 属性在 .NET 2.0 中已废除,推荐用来替代的是 XPathNavigator 属性,从前面的 BlogCacheDependency 类中可以看到,它是来源于 XPathDocument.CreateNavigator() 所创建的,从 MSDN 我们可以知道,XPathDocument 类提供一种只读的快速缓存,显然就这个例子而言确实更加适合。




  2、考虑一下,BlogCacheDependency 类中的 DependencyDispose 方法作何用?它与 Dispose 方法有何区别?让我们想一想,如果说某一次检查更新时,已经发现依赖变化了,但是却一直没有再次发送请求,那么这时会不会始终连续不断按间隔地执行 CheckDependencyCallback 方法呢?如果真的如此的话,那岂不是完全多余,因为只要查到一次有变化就不必再查了嘛。而如果我们进行跟踪或是记录日志的话可以发现,实际上只要查到依赖变化以后就不会再次 Check 了。奥妙在哪里?想一想就能知道 NotifyDependencyChanged 方法大有玄机,而且之所以会有 DependencyDispose 方法的原因其实也就在这里。其中的设计思想,值得我们细细品味吧。




  三、页面使用到的 translate.xsl




  不再多说,贴出主要代码:




1
2


3
4
5
6
7

8
9

10

11

12


13




  四、执行情况




  这是最初执行的截图:







  当博客园首页没有出现新贴子的时候,我们刷新页面,总是可以得到如下的页面:







  而一旦有了新贴子,那么刷新的时候出现的是上一张图。




  五、你想再高级一点吗?




  如果你和我一样懒或是比我更懒,那么你可以考虑再用 javascript 写一个自动刷新页面的小功能,再把页面美工一下,或是包装成一个可复用的组件用在你的网站上,又或者只是想在本机里做一个“我最关注的内容集”之类的东西?嗯,想来效果会比较不错的哦。




来源:网络












































添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.