Asp.net

MemoryCache Empty :設置後返回 null

  • September 14, 2011

我對使用新的 .NET 4 System.Runtime.Caching MemoryCache 的 MVC 3 應用程序有疑問。我注意到,在看似不可預測的時間之後,它會停止記憶體內容,並且表現得好像它是空的。考慮一下我直接從 ASP.NET MVC 中的測試視圖中獲取的這段程式碼:

MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) });
Response.Write(MemoryCache.Default["myname"]);

當它工作時,可以預見的是“fred”會被列印出來。然而,當問題開始出現時,儘管Set(), 的值為MemoryCache.Default["myname"]null。我可以通過在行上設置斷點並使用即時視窗直接設置和讀取記憶體來證明這一點Response.Write()- 它只是不會設置它並保持為空!讓它再次工作的唯一方法是導致 AppDomain 回收。

有趣的是,當應用程序正常工作時,我可以通過斷線Response.Write()並執行來引發問題MemoryCache.Default.Dispose()。之後, MemoryCache.Default 本身不是 null (為什麼會這樣?),但不會保存任何設置。它不會導致任何錯誤,但不會保存任何內容。

任何人都可以驗證並解釋嗎?正如我相信我已經發現的那樣,當應用程序停止自行執行時,有些東西正在處理MemoryCache.Default,但不是我!


更新

好吧,我現在厭倦了這個問題!CLRProfiler 似乎不適用於 MVC 3。SciTech 的 CLR 工具很好 - RedGate ANTS 也是如此。但是他們告訴我的只是 MemoryCache 對象正在被某些東西處理!我還證明(通過時間戳列印)我頁面上應該記憶體的 PartialView(由 OutputCacheAttribute 指定)在幾分鐘後停止記憶體 - 每次呼叫頁面時都會開始刷新。只是為了澄清環境,我直接在執行 Win 7 Ultimate 的開發工作站上的 IIS 7.5 伺服器上執行。上面提到的記憶體工具表明我只使用了大約 9mb 的記憶體來播放對象。

絕望中,我將記憶體程式碼更改為首先搜尋環境 HttpContext 以連接並使用其記憶體功能(如果可用)。早期的測試表明這是可靠的,但感覺就像一個討厭的黑客。

我感覺 MemoryCache 和 OutputCache 不能與 MVC 3 一起使用…

所以,這裡有一些消息。我們對此進行了調查,是的,這是 .NET 4 中的一個錯誤。

好消息是它已在 .NET 4.5 中修復,因此如果可以,請將您的安裝更新到 .NET 4.5,這樣就可以了。

另一個好消息是,此修復已向後移植到 .NET 4,並將作為 QFE(快速修復…您將應用的一次性修復)#578315 提供。它在幾天前被反向移植/修復,應該盡快出來。我會盡量得到一個確切的日期,但很快。

另一個好消息是在 QFE 之前的 .NET 4 上有一個解決方法。解決方法很奇怪,但它可以解除對您的阻止。

using (ExecutionContext.SuppressFlow())     {
         // Create memory cache instance under disabled execution context flow
        return new YourCacheThing.GeneralMemoryCache(…);
}

希望這可以幫助。

更新:修補程序是<http://support.microsoft.com/kb/2828843>,您可以在這裡申請:https://support.microsoft.com/contactus/emailcontact.aspx?scid=sw;%5BLN%5D; 1422

引用自:https://stackoverflow.com/questions/7422859