2012-10-24 67 views
2

MemoryCache是一個線程安全的類,根據this的文章。但我不明白它在特定情況下的表現如何。例如我的代碼:MemoryCache Contains()線程安全

static private MemoryCache _cache = MemoryCache.Default; 

... 

if (_cache.Contains("Test")) 
{ 
    return _cache.Get("Test") as string; 
} 
  1. 燦元素的存活時間到期我打電話Contains()只是經過這麼null值將被退回?
  2. 可以在我致電Contains()後再另一個線程刪除項目null值會被返回嗎?

回答

3

是的,是的,這些是常見的競爭條件。你可以避開他們,如果通過簡單地寫代碼爲

var test = _cache.Get("Test"); 
if (test != null) { 
    return test as string; 
} 
+0

如果我想要寫在過期的項目我只是用'其他{字符串結果=「從我的數據庫中的一些數據」新的價值; _cache.Set(「Test」,result,DateTimeOffset.UtcNow.AddSeconds(30));返回結果; }'一切都會好的。這樣對嗎? – ChruS

+0

@ChruS:不,在這種情況下,爲避免競爭條件,您應該使用['AddOrGetExisting'](http://msdn.microsoft.com/zh-cn/library/dd780587.aspx)。 – Jon