我不明白滑动过期应该在.NET 4.0的System.Runtime.Caching.MemoryCache中如何工作。

根据文档,到期时间跨度是“在从缓存中逐出缓存条目之前必须访问缓存条目的时间范围”。

但是,以下单元测试失败:

private const string AnyKey = "key";
private const string AnyValue = "value";

private readonly TimeSpan timeout = TimeSpan.FromSeconds(0.5);

private void WaitSixtyPercentOfTheTimeout()
{
    Thread.Sleep(TimeSpan.FromSeconds(timeout.TotalSeconds*0.6));
}

[Test]
public void Get_RefreshesTimeoutOfSlidingExpiration()
{
    var cache = MemoryCache.Default;
    cache.Set(AnyKey, AnyValue, new CacheItemPolicy {SlidingExpiration = timeout});

    WaitSixtyPercentOfTheTimeout();
    cache[AnyKey].Should().Be(AnyValue);
    WaitSixtyPercentOfTheTimeout();

    cache[AnyKey].Should().Be(AnyValue);
}

private void UpdateCallback(CacheEntryUpdateArguments arguments)
{
}


碰巧的是,我做了一个小改动,解决了这个问题。但是,如果现在有错误或功能,有人吗?

设置UpdateCallBack之后,到期将按预期工作:

// [...]

[Test]
public void Get_RefreshesTimeoutOfSlidingExpiration()
{
    var cache = MemoryCache.Default;
    cache.Set(AnyKey, AnyValue, new CacheItemPolicy {SlidingExpiration = timeout, UpdateCallback = UpdateCallback});

    WaitSixtyPercentOfTheTimeout();
    cache[AnyKey].Should().Be(AnyValue);
    WaitSixtyPercentOfTheTimeout();

    cache[AnyKey].Should().Be(AnyValue);
}

private void UpdateCallback(CacheEntryUpdateArguments arguments)
{
}

最佳答案

延长超时时间似乎可以解决问题。使其在我的机器上工作2秒钟:

private readonly TimeSpan timeout = TimeSpan.FromSeconds(2);


我猜想当前的缓存机制在时间安排上不是很准确,但是在实践中您无论如何都不会保持缓存半秒钟。

关于c# - 为什么MemoryCache中的滑动过期行为如此奇怪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22960525/

10-13 06:55