मुझे लगता है कि GetOrAdd() हमेशा फैक्ट्री प्रतिनिधि को निष्पादित करता है, भले ही मूल्य शब्दकोश में मौजूद है। उदाहरण के लिए:ConcurrentDictionary.GetOrAdd हमेशा निष्पादित करें विधि
class Program
{
private static ConcurrentDictionary<string, string> _cache = new ConcurrentDictionary<string, string>();
static void Main(string[] args)
{
string value;
value = GetValueFromCache("A"); // cache is empty, CacheValueFactory executes, A is added
value = GetValueFromCache("A"); // cache contains A, CacheValueFactory executes
value = GetValueFromCache("C"); // cache contains A, CacheValueFactory, C is added
value = GetValueFromCache("A"); // cache contains A and C, CacheValueFactory executes
}
private static string GetValueFromCache(string key)
{
string val = _cache.GetOrAdd(key, CacheValueFactory(key));
return val;
}
private static string CacheValueFactory(string key)
{
if (key == "A")
return "Apple";
else if (key == "B")
return "Banana";
else if (key == "C")
return "Cherry";
return null;
}
}
GetValueFromCache ('ए') के लिए पहली कॉल करने पर, कैश खाली और एक है: एप्पल जोड़ा जाता है। डीबगर के साथ कदम रखते हुए, मैंने देखा कि GetValueFromCache ("ए") के दूसरे और तीसरे कॉल पर, कैशवैल्यू फैक्ट्री() विधि हमेशा निष्पादित होती है। क्या यह उम्मीद है? मैंने सोचा होगा कि अगर कुंजीपटल शब्दकोश में मौजूद है तो प्रतिनिधि विधि निष्पादित नहीं होगी।
ओउप्स। तुम सही हो :) – Bullines
गोटो! मैं भी इस पर अटक गया था। धन्यवाद। Dooh। – bornfromanegg