查看MemoryCache的文檔,我期望如果在過期期間內訪問了某個對象,則會刷新該期限。說實話,我認爲我從「滑動」這個名字推斷出任何東西。SlidingExpiration和MemoryCache
然而,似乎從這個測試
[Test]
public void SlidingExpiryNotRefreshedOnTouch()
{
var memoryCache = new MemoryCache("donkey")
{
{
"1",
"jane",
new CacheItemPolicy {SlidingExpiration = TimeSpan.FromSeconds(1) }
}
};
var enumerable = Enumerable.Repeat("1", 100)
.TakeWhile((id, index) =>
{
Thread.Sleep(100);
return memoryCache.Get(id) != null; // i.e. it still exists
})
.Select((id, index) => (index+2)*100.0/1000); // return the elapsed time
var expires = enumerable.Last(); // gets the last existing entry
expires.Should().BeGreaterThan(1.0);
}
它未能並表現出該物體被排出,一旦時間跨度是完整的對象是否已經被訪問的行爲。 Linq查詢在enumerable.Last()中執行;聲明,此時只會在緩存未過期時纔會執行。一旦它停止,列表中的最後一項將指示該項目在緩存中所處的時間。
對於清晰度這個問題是關於MemoryCache的行爲。不是linq查詢。
這是其他人的期望嗎(即過期每次觸摸都不會滑動)? 是否存在延長「觸摸」對象的生命期的模式?
更新我發現,即使我寫了一個包裝緩存周圍並重新添加的對象回到我每次檢索它的時候緩存,與另一SlidingExpiration它仍然只是兌現的初始設置。爲了以我想要的方式工作,我必須在重新添加它之前將它從緩存中物理刪除!這可能會在多線程環境中導致不合需要的競爭條件。
也許你想把這個問題分成兩半? 「MemoryCache」使用情況或Linq使用情況有問題嗎? –