C# MemoryCache.AddOrGetExisting的作用是什么?

C# MemoryCache.AddOrGetExisting的作用是什么?,c#,.net,memorycache,C#,.net,Memorycache,其行为被描述为: 使用指定的键和值将缓存项添加到缓存中 和绝对过期值 并且它返回: 如果存在具有相同密钥的缓存项,则为现有缓存项;否则,无效 具有这些语义的方法的目的是什么?这个例子是什么?我实际上没有用过这个,但我想一种可能的使用情况是,如果您希望使用特定密钥的新条目无条件地更新缓存,并且希望显式地处理返回的旧条目。通常情况下,如果匹配条目不存在,您只希望创建缓存条目(也就是说,您不希望覆盖现有值) 允许您以原子方式执行此操作。如果没有,则无法以原子的线程安全方式执行get测试集。例如: T

其行为被描述为:

使用指定的键和值将缓存项添加到缓存中 和绝对过期值

并且它返回:

如果存在具有相同密钥的缓存项,则为现有缓存项;否则,无效


具有这些语义的方法的目的是什么?这个例子是什么?

我实际上没有用过这个,但我想一种可能的使用情况是,如果您希望使用特定密钥的新条目无条件地更新缓存,并且希望显式地处理返回的旧条目。

通常情况下,如果匹配条目不存在,您只希望创建缓存条目(也就是说,您不希望覆盖现有值)

允许您以原子方式执行此操作。如果没有,则无法以原子的线程安全方式执行get测试集。例如:

 Thread 1                         Thread 2
 --------                         --------

 // check whether there's an existing entry for "foo"
 // the call returns null because there's no match
 Get("foo")

                                  // check whether there's an existing entry for "foo"
                                  // the call returns null because there's no match
                                  Get("foo")

 // set value for key "foo"
 // assumes, rightly, that there's no existing entry
 Set("foo", "first thread rulez")

                                  // set value for key "foo"
                                  // assumes, wrongly, that there's no existing entry
                                  // overwrites the value just set by thread 1
                                  Set("foo", "second thread rulez")

(另请参阅该方法,该方法在变量级别启用更复杂的等效项,以及和上的wikipedia条目。)LukeH的答案是正确的。因为其他答案表明该方法的语义可能会有不同的解释,我认为值得指出的是,
AddOrGetExisting
实际上不会更新现有的缓存项

所以这个代码

Console.WriteLine(MemoryCache.Default.AddOrGetExisting("test", "one", new CacheItemPolicy()) ?? "(null)"); Console.WriteLine(MemoryCache.Default.AddOrGetExisting("test", "two", new CacheItemPolicy())); Console.WriteLine(MemoryCache.Default.AddOrGetExisting("test", "three", new CacheItemPolicy())); Console.WriteLine(MemoryCache.Default.AddOrGetExisting(“test”,“one”,new CacheItemPolicy())??(“null”); WriteLine(MemoryCache.Default.AddOrGetExisting(“test”,“two”,new CacheItemPolicy()); WriteLine(MemoryCache.Default.AddOrGetExisting(“test”,“three”,new CacheItemPolicy()); 将打印

(null) one one (空) 一 一
另一件需要注意的事情是:当
AddOrGetExisting
找到现有缓存项时,它不会处理传递给调用的CachePolicy。如果使用设置昂贵资源跟踪机制的自定义更改监视器,这可能会有问题。通常,当缓存项被逐出时,缓存系统会调用
Dipose()
在ChangeMonitors上。这使您有机会注销事件等。但是,当
AddOrGetExisting
返回现有条目时,您必须自己处理。

+1表示“当您要显式处理旧条目时”这是有道理的,但我想知道这是不是真的…似乎没有人解释为什么在您第一次调用AddOrGetExisting时它返回null。有道理,它第一次返回null-从名称开始,它不存在,所以它添加了-否则返回。然后,您还可以将其用作检查值是否已在中。与Laz结合使用的示例好吧,我很高兴我不是唯一一个……我本来希望得到我在第一次调用时传递回来的值,这不是很好的解释。但是为什么我们要使用
Add
呢?总是使用
AddOrGetExisting
不是更好吗?这绝对不是“不可能的”,因为您可以将Get/Set调用包装在lock语句中。还需要注意的是:
Add
方法或调用
AddOrGetExisting