Класс ниже вызывает событие для каждого нового зарегистрированного «dataKey» и вызывает событие, когда «dataKey» отменяется и счетчик для этого «dataKey» равен нулю.
Этот класс стремится быть поточно-ориентированным, и я пытаюсь сделать его как можно более производительным.
Мой вопрос; в методе Deregister я могу каким-то образом удалить 2-й поиск при обновлении значения (_data [dataKey] = currentCountValue;)?
Я не могу просто обновить переменную currentCountValue, так как значение обновляется только в локальном стеке, а не в Словаре.
Или вы можете предложить какие-либо улучшения производительности? Я не думаю, что смогу снять блокировку и использовать операции CAS (блокированные методы) для обновления счетчика, так как словарь не является потокобезопасным для обновлений при использовании, как это… верно?
/ Я использую c # 3.0.
Спасибо за ваше время.
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);
}
}
}
}
}