2011-03-15 74 views
1

所以我注意到HttpContext.Cache被清除,只要工作進程被回收。我有一個回調,當緩存項到期時,將緩存項重新插入緩存。但是,當這個過程被回收時,這似乎不會發生。asp.net緩存和回收工作進程

我在我的Application_Start中打了一個電話,它將適當的項目添加到緩存中,但似乎在工作進程被回收後調用。有回調我可以用來重新填充緩存回收或它應該是Application_Start?另外,我怎樣才能在本地測試呢?

我很確定我在這裏做錯了什麼。

+0

Application_Start是正確的地方這樣做 - 爲什麼它不工作我不知道。很高興看到一些代碼。 – 2011-03-15 16:49:25

回答

4

工作流程回收可視爲停止並啓動持有.Net的流程。所有的AppDomain數據都會丟失。

從我的理解Application_Start僅在第一個請求到達時執行。我希望即使在回收之後,行爲也是一樣的。

但是,如果它不執行(有趣),那麼你總是可以觸發它在別的地方。有很多方法可以做到這一點。例如Application_BeginRequest或在第一次加載期間引用的任何靜態類的ctor。

請注意,HttpContext.Cache實際上只是一個靜態對象,因此只要有一個static bool isInitialized = false;,一旦init完成,它就會被更改,並且它將跨請求保留。有一個良好的lock() {}它應該順利運行(所以兩個請求不會啓動兩個初始化)。

我通常解決這個問題的方法是根據需求緩存。不適合所有解決方案。此外,我使用Enterprise Framework或AppFabric爲緩存設置超時(TTL)。

+0

那麼,我可以告訴它不重新添加回緩存的唯一原因是因爲cacheItem應該啓動進行數據庫修改的進程。哪些沒有完成。 – Buildstarted 2011-03-15 17:03:12

+0

這是一種'duh'的答案,我不敢相信沒有跨過我的腦海。 :) – Buildstarted 2011-03-15 17:07:17

1

當AppDomain被回收時,所有程序集都被卸載,因此所有數據都被清除。當應用程序重新啓動時,它基本上就像從頭開始一樣,按照這種方式重新生成緩存是沒有辦法的(據我所知)。

這與停止和啓動應用程序不同,後者基本上保存了應用程序的狀態,並且在重新啓動後恢復其以前的狀態(包括緩存)。

我唯一能想到的就是禁用應用程序回收,但不建議這樣做,因爲最終會導致不斷增加的緩存大小,這將成爲瓶頸。您可以將數據保存到不同的緩存機制,如SQL數據庫。

-1

枚舉CacheItemPriority有一個「不可移除​​」選項,可防止在垃圾收集期間將項目從緩存中移除。

從MSDN:作爲服務器釋放系統內存

與此優先級別的緩存項將不會自動從緩存 刪除。但是,具有此優先級的 項目會根據項目的絕對或滑動到期時間與其他項目 一起刪除。