gpt4 book ai didi

c# - AddOrGetExisting 不考虑过期

转载 作者:太空狗 更新时间:2023-10-29 23:22:36 24 4
gpt4 key购买 nike

我正在使用 (.NET 4.5) MemoryCache,结合 SlidingExpiration。

我注意到方法 .AddOrGetExisting() 似乎没有记住过期时间,而 .Get() 却有。

单元测试:

    [TestMethod]
public void NonWorking()
{
var memCache = new MemoryCache("somekey");
var cachePolicy = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(1) };

var cacheEntry = memCache.AddOrGetExisting("key1", "foo", cachePolicy);
Assert.AreEqual(null, cacheEntry); // OK: AddOrGetExisting returns null, because it wasn't existing yet
Thread.Sleep(1100);

// Expecting null, since the existing item for key1 has expired by now.
// It is, however, still "foo".
Assert.AreEqual(null, memCache.AddOrGetExisting("key1", "bar", cachePolicy));

// FYI: afterwards, memCache.Get("key1") still equals "foo"
}

[TestMethod]
public void Working()
{
var memCache = new MemoryCache("somekey");
var cachePolicy = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(1) };

var cacheEntry = memCache.AddOrGetExisting("key1", "foo", cachePolicy);
Assert.AreEqual(null, cacheEntry); // OK: AddOrGetExisting returns null, because it wasn't existing yet
Thread.Sleep(1100);
Assert.AreEqual(null, memCache.Get("key1"));
}

问题:

这是 .AddOrGetExisting() 的预期行为吗?

我可以回退到 .Get(),然后,如果为 null,则使用 .Add()。
但是,因此我必须实现自己的锁定以确保线程安全。

最佳答案

问题出在第二次调用AddOrGetExisting。调用方法时,它会创建一个新的 MemoryCacheEntry 实例 SourceCode of .net Framework .在此条目中,它将 Expiration 设置为 UtcNow + 1 Second,使您的 Thread.Sleep 无用。 (参见构造函数的 Line)

我不知道为什么它不使用现有条目的策略来确定超时。这line我猜应该使用 existingEntry 而不是 entry。也许这是一个错误

这是框架中产生“不当行为”的代码

existingEntry = _entries[key] as MemoryCacheEntry;
// has it expired?
if (existingEntry != null && /* THERE => */ entry.UtcAbsExp <= DateTime.UtcNow) {
toBeReleasedEntry = existingEntry;
toBeReleasedEntry.State = EntryState.RemovingFromCache;
existingEntry = null;
}

existingEntry 是应该过期的“旧条目”,entry 是 UtcAbsExp 值未过期的新条目。

关于c# - AddOrGetExisting 不考虑过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com