從緩存中移除項(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|
精品国产人成亚洲区|