Нужно аккумулировать значение по ключу(т.е. накапливать +1), после достижения значения счетчика N удалить значение из кэша. К кэшу может обращаться несколько потоков.
Т.е. кэш должен уметь делать два действия в транзакции:
- прочитать значение и увеличить его на 1
- прочитать значение и удалить ключ
при этом другие потоки при этих же операциях должны ожидать, если ключ заблокирован, и прочитать уже новое значение(или отсутствие значения), "грязное чтение" не разрешено.
Посмотрел memoryCache и ConcurrentDictionary, но они не совсем подходят.
Какими средствами воспользоваться?
public sealed class MyCounterCache
{
Dictionary<string,int> Data = new Dictionary<string,int>();
public int Действие1()
{
lock(Data)
{
// Do what you want
}
}
public int Действие2()
{
lock(Data)
{
// Do what you want
}
}
}
tommy87, для выполнения сформулированной вами задачи:
"Т.е. кэш должен уметь делать два действия в транзакции:
- прочитать значение и увеличить его на 1
- прочитать значение и удалить ключ..."
- такого механизма хватит за глаза.
Блокировка отдельных ключей может понадобится, если время выполнения операций будет большим. В вашем случае операции примитивны (чтение и запись значения), одной общей блокировки кэша достаточно.