ich Antritt mit einigem .NET 3.5-Code zu arbeiten und fand die folgende Erweiterungsmethode für einen Cache verwendet wird ::Für .NET 3.5 wie würden Sie einen thread-sicheren Cache erstellen oder hinzufügen?
public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> @this, TKey key,Func<TKey,TValue> factory,bool useLocking)
{
TValue value;
if([email protected](key,out value))
{
if (useLocking)
{
lock ((@this as ICollection).SyncRoot)
{
if ([email protected](key, out value))
{
@this[key] = value = factory(key);
}
}
}
else
{
@this[key] = value = factory(key);
}
}
return value;
}
Der Cache in Frage String-Schlüssel verschlüsselt ist, und mit useLocking = true. Es wird immer auf diese Weise zugegriffen (es gibt keine streunenden TryGetValue
). Es gibt auch kein Problem bei der Verwendung der Eigenschaft SyncRoot
, da das Wörterbuch privat ist und nirgendwo anders verwendet wird. Die doppelte Sperre ist gefährlich, da ein Wörterbuch das Lesen während des Schreibens nicht unterstützt. Während technisch noch kein Problem gemeldet wurde, da das Produkt nicht ausgeliefert wurde, glaube ich, dass dieser Ansatz zu Rennbedingungen führen wird.
Schalten Sie den
Dictionary<,>
einenHashtable
. Wir werden die Typensicherheit verlieren, aber wir werden in der Lage sein, das von uns angestrebte Nebenläufigkeitsmodell zu unterstützen (1 Autor, mehrere Leser).Entfernen Sie den äußeren TryGetValue. Auf diese Weise muss jeder Lesevorgang eine Sperre erhalten. Dies ist möglicherweise schlecht für die Leistung, aber eine unangekündigte Sperre sollte ziemlich billig sein.
Beide sind ziemlich beschissen. Hat jemand einen besseren Vorschlag? Wenn dies .NET 4-Code wäre, würde ich es nur auf ConcurrentDictionary
umstellen, aber ich habe diese Option nicht.
Yargh! Völlig unzusammenhängend ... aber schreibe keinen Code mit @this. Du bist in einer statischen Methode; Versuchen Sie nicht, es wie eine Instanzmethode aussehen zu lassen. –
das ist nicht mein Code! Wenn es mein Code wäre, würde ich die Argumentvalidierung hinzufügen. –