다음 테스트는 간헐적으로 실패합니다. 절대 만기 시간과 항목이 제거되기 전에 호출되어야하는 업데이트 콜백을 사용하여 MemoryCache에 항목을 캐시합니다. 그러나 때때로 콜백은 테스트가 끝나기 전에 호출되기도하고 때로는 전혀 호출되지 않을 수도 있습니다.MemoryCache UpdateCallback을 사용하여 테스트
버퍼 시간이 충분하면 항상 적어도 한 번 호출됩니다. 하지만 캐시가 만료되기 전에 항상 데이터를 업데이트해야하므로 캐시가 내 목적을 달성하지 못합니다.
지금 실제 시나리오에서는 10 초 만료 시간과 세분성을 갖지 않지만이 테스트가 간헐적으로 실패한다는 것은 여전히 저를 귀찮게합니다.
왜 이런 일이 발생했는지 생각해보십시오.
참고 : 또한 60 초 만료 및 5 초 버퍼로 간헐적으로 실패합니다.
using System;
using System.Runtime.Caching;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class MemoryCacheTest
{
private const double ExpiryInSeconds = 10;
private const double ExpiryBufferInSeconds = 5;
private readonly object updateItemCounterLock = new object();
private int updateItemCounter = 0;
[TestMethod]
public async Task MemoryCacheUpdateTest()
{
// Set item in cache with absolute expiration defined above
MemoryCache cache = MemoryCache.Default;
CacheItem cacheItem = new CacheItem("key", "value");
CacheItemPolicy cacheItemPolicy = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.Now + TimeSpan.FromSeconds(ExpiryInSeconds),
UpdateCallback = new CacheEntryUpdateCallback(this.UpdateItem)
};
cache.Set(cacheItem, cacheItemPolicy);
// Delay for absolute expiration time + buffer
await Task.Delay(TimeSpan.FromSeconds(ExpiryInSeconds) + TimeSpan.FromSeconds(ExpiryBufferInSeconds));
// Test that the update callback was invoked once
Assert.AreEqual(1, updateItemCounter);
}
// Incrememnts the updateItemCounter
private void UpdateItem(CacheEntryUpdateArguments args)
{
lock (updateItemCounterLock)
{
updateItemCounter++;
}
}
}
눈에 띄면 AbsoluteExpiration 값은 항목을 제거한 후의 시간을 나타냅니다. 이것이 의미하는 바는 유효 기간이 최소 시간이며 절대 시간 (아이러니하게도)이 아닙니다. 여기서 절대적인 것은 그것이 미끄러지는 시간 제한이 아니라는 사실입니다. 그것은 정확한 순간에 축출 될 것입니다. 기본적으로 만료 후 언제든지 항목을 제거 할 수 있으며 몇 초 또는 몇 분이 지나야 수도 있습니다. 내 검사에 따르면 만료 시간이 만료 된 후 0 ~ 30 초 사이에 만료 될 수 있지만 길어질 수 있습니다. –
이 게시물은 내부 구현에 일종의 하드 유선 20 초 타이머가 있음을 나타냅니다. http://stackoverflow.com/questions/12630168/memorycache-absoluteexpiration-acting-strange 맞는지 여부는 확실하지만 확실합니다. 테스트 결과에서 내가 보는 것과 일치합니다. –