從緩存中移除項(xiàng)時(shí)通知應(yīng)用程序
2007/1/8 21:28:39

在大多數(shù)緩存方案中,當(dāng)從緩存中移除項(xiàng)后,直到再次需要此項(xiàng)時(shí),才需要將其放回緩存中。典型的開發(fā)模式是在使用項(xiàng)之前始終檢查該項(xiàng)是否已在緩存中。如果項(xiàng)位于緩存中,則可以使用。如果不在緩存中,則應(yīng)再次檢索該項(xiàng),然后將其添加回緩存。 
但是,在某些情況下,如果從緩存中移除項(xiàng)時(shí)通知應(yīng)用程序,可能非常有用。例如,您可能具有一個(gè)緩存的報(bào)告,創(chuàng)建該報(bào)告需花費(fèi)大量的時(shí)間進(jìn)行處理。當(dāng)該報(bào)告從緩存中移除時(shí),您希望重新生成該報(bào)告,并立即將其置于緩存中,以便下次請(qǐng)求該報(bào)告時(shí),用戶不必等待對(duì)此報(bào)告進(jìn)行處理。
為了在從緩存中移除項(xiàng)時(shí)能夠發(fā)出通知,ASP.NET 提供了 CacheItemRemovedCallback 委托。該委托定義編寫事件處理程序時(shí)使用的簽名,當(dāng)對(duì)從緩存中移除項(xiàng)進(jìn)行響應(yīng)時(shí)會(huì)調(diào)用此事件處理程序。ASP.NET 還提供 CacheItemRemovedReason 枚舉,用于指定移除緩存項(xiàng)的原因。
通常,通過在管理嘗試檢索的特定緩存數(shù)據(jù)的業(yè)務(wù)對(duì)象中創(chuàng)建處理程序,來實(shí)現(xiàn)回調(diào)。例如,您可能有一個(gè) ReportManager 對(duì)象,該對(duì)象具有兩種方法,即 GetReport 和 CacheReport。GetReport 報(bào)告方法檢查緩存以查看報(bào)告是否已緩存;如果沒有,該方法將重新生成報(bào)告并將其緩存。CacheReport 方法具有與 CacheItemRemovedCallback 委托相同的函數(shù)簽名;從緩存中移除報(bào)告時(shí),ASP.NET 會(huì)調(diào)用 CacheReport 方法,然后將報(bào)告重新添加到緩存中。 當(dāng)從緩存中移除項(xiàng)時(shí)通知應(yīng)用程序   
創(chuàng)建一個(gè)類,負(fù)責(zé)從緩存中檢索項(xiàng)并處理回調(diào)方法,以將項(xiàng)添加回緩存中。 
在該類中,創(chuàng)建用于將項(xiàng)添加到緩存中的方法。 
在該類中,創(chuàng)建用于從緩存中獲取項(xiàng)的方法。 
創(chuàng)建用于處理緩存項(xiàng)移除回調(diào)的方法。該方法必須具備與 CacheItemRemovedCallback 委托相同的函數(shù)簽名。從緩存中刪除項(xiàng)時(shí),會(huì)在該方法中執(zhí)行要運(yùn)行的邏輯,如重新生成項(xiàng)并將其添加回緩存中。 測(cè)試緩存項(xiàng)回調(diào)   
創(chuàng)建一個(gè) ASP.NET 網(wǎng)頁,該網(wǎng)頁將調(diào)用類中用于將項(xiàng)添加到緩存中的方法。 
下面的代碼示例演示如何調(diào)用 ReportManager 類的 GetReport 方法(在此過程后面的示例中定義)。然后將在使用頁面的 Page_Load 方法期間顯示 Label 控件 Label1 中的報(bào)告。       
protected void Page_Load(object sender, EventArgs e) {    this.Label1.Text = ReportManager.GetReport(); }
 
在瀏覽器中請(qǐng)求 ASP.NET 頁并查看報(bào)告。 
報(bào)告是在首次請(qǐng)求頁時(shí)創(chuàng)建的,在緩存中的報(bào)告被移除之前,后續(xù)請(qǐng)求都將訪問緩存中的報(bào)告。 示例 
下面的代碼示例演示一個(gè)名為 ReportManager 的、用于在從緩存中刪除項(xiàng)時(shí)處理通知的完整類。該類管理字符串形式的報(bào)告,此報(bào)告表示一個(gè)長期運(yùn)行的進(jìn)程。
盡管該示例使用聲明為 static(在 Visual Basic 中為 Shared)的類,但并不是必須使用靜態(tài)類。不過,刪除緩存項(xiàng)時(shí),用于處理回調(diào)的方法必須存在。例如,不應(yīng)在 ASP.NET 頁中實(shí)現(xiàn)回調(diào)處理程序,因?yàn)樵趶木彺嬷袆h除項(xiàng)之前該頁可能已被釋放,因此用于處理回調(diào)的方法將不可用。為了確保從緩存中刪除項(xiàng)時(shí)處理回調(diào)的方法仍然存在,請(qǐng)使用該方法的靜態(tài)類。但是,靜態(tài)類的缺點(diǎn)是需要保證所有靜態(tài)方法都是線程安全的。    警告 
請(qǐng)不要在頁面中將 CacheItemRemovedCallback 設(shè)置為一個(gè)方法。除了在釋放頁面后回調(diào)無法使用頁面方法以外,將回調(diào)指向頁面方法還會(huì)阻礙垃圾回收將頁面使用的內(nèi)存回收。由于回調(diào)包含對(duì)頁面的引用,而垃圾回收器不會(huì)從內(nèi)存中移除包含任何引用的項(xiàng),因此會(huì)出現(xiàn)這種情況。在加載應(yīng)用程序期間,這可能會(huì)導(dǎo)致內(nèi)存很快被用光。
該示例類包括以下功能: 
私有成員,用于跟蹤報(bào)告是否已從緩存中移除。 
名為 CacheReport 的方法,用于將項(xiàng)以 MyReport 的名稱添加到緩存中,并將該項(xiàng)設(shè)置為在添加到緩存中

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 国产无遮挡无码视频免费软件| 精品国产福利一区二区| 日本三级香港三级久久99| 免费无码AV一区二区三区| 91av国产精品| 日本强好片久久久久久AAA| 伊人热热久久原色播放www| 精品一区二区三区色花堂| 在线播放无码后入内射少妇| 三级小说第一页| 欧洲卡一卡二卡在线| 午夜精品久久久久久久无码| 2020国产在线| 成人网站免费看黄a站视频| 亚洲无码一区二区三区| 老司机美女一级毛片| 国产精品视频李雅| 中文字幕在线国产| 日韩在线播放中文字幕| 免费无码专区毛片高潮喷水| 色五月激情小说| 国产精品免费久久久久影院| 中文字幕人妻无码一夲道| 欧美国产日韩久久mv| 又粗又黄又猛又爽大片免费| 亚洲日本久久一区二区va| 巨粗挺进女县长| 久香草视频在线观看| 玉蒲团之天下第一| 国产免费AV片在线观看播放| av一本久道久久综合久久鬼色| 日韩一区二区三区不卡视频| 亚洲熟女综合色一区二区三区| 色婷婷视频在线观看| 国产精品亚洲天堂| www.尤物.com| 日韩在线一区二区三区免费视频| 亚洲人成77777在线播放网站| 欧美性色欧美a在线播放| 亚洲欧洲美洲无码精品VA| 精品国产人成亚洲区|