Ich stelle fest, dass GetOrAdd() den Factory-Delegaten immer ausführt, auch wenn der Wert im Wörterbuch vorhanden ist. Zum Beispiel:ConcurrentDictionary.GetOrAdd führt immer die Delegate-Methode aus
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;
}
}
Nach dem ersten Aufruf von GetValueFromCache ("A"), ist der Cache leer und A: Apple hinzugefügt. Als ich mit dem Debugger eintrat, bemerkte ich, dass die CacheValueFactory() -Methode beim zweiten und dritten Aufruf von GetValueFromCache ("A") immer ausgeführt wird. Wird das erwartet? Ich hätte gedacht, dass die Delegate-Methode nicht ausgeführt werden würde, wenn der Schlüssel im Wörterbuch vorhanden ist.
Hoppla. Du hast Recht :) – Bullines
Gotcha! Ich war auch dabei. Vielen Dank. Dooh. – bornfromanegg