Die folgende Klasse löst ein Ereignis für jeden neu registrierten "dataKey" aus und löst ein Ereignis aus, wenn ein "dataKey" abgemeldet wird, und zählt dafür "dataKey ist null.Werttypen und Wörterbuchabruf
Diese Klasse soll threadsicher sein und ich versuche, dies so performant wie möglich zu machen.
Meine Frage ist; In der Deregister-Methode kann ich die zweite Suche irgendwie entfernen, wenn ich den Wert aktualisiere (die _data [dataKey] = currentCountValue;)?
Ich kann die Variable currentCountValue nicht einfach aktualisieren, da der Wert nur auf dem lokalen Stapel und nicht im Wörterbuch aktualisiert wird.
Oder können Sie irgendwelche Leistungsverbesserungen vorschlagen? Ich glaube nicht, dass ich die Sperre entfernen und CAS-Operationen (Interlocked-Methoden) verwenden kann, um die Zählung zu aktualisieren, da das Wörterbuch bei Verwendung dieser Art nicht sicher für Updates ist ... oder?
/Ich verwende C# 3.0.
Danke für Ihre Zeit.
public sealed class DataCounter
{
public event EventHandler NewKeyEvent;
public event EventHandler ZeroCountEvent;
private readonly Dictionary<string, int> _data = new Dictionary<string, int>();
public void Register(string dataKey)
{
lock (_data)
{
if (_data.ContainsKey(dataKey))
{
_data[dataKey]++;
}
else
{
_data.Add(dataKey, 1);
if (NewKeyEvent != null) NewKeyEvent(this, null);
}
}
}
public void Deregister(string dataKey)
{
lock (_data)
{
int currentCountValue;
if (_data.TryGetValue(dataKey, out currentCountValue))
{
if (currentCountValue > 0)
{
currentCountValue--;
_data[dataKey] = currentCountValue;
}
if (currentCountValue == 0)
{
if (ZeroCountEvent != null) ZeroCountEvent(this, null);
}
}
}
}
}