Реализация кеша с использованием ConcurrentDictionaryC#

Место общения программистов C#
Anonymous
Реализация кеша с использованием ConcurrentDictionary

Сообщение Anonymous »

Я пытаюсь создать собственную реализацию кэша для API. Я впервые работаю с ConcurrentDictionary и не знаю, правильно ли я его использую. Во время теста что-то выдало ошибку, и мне пока не удалось воспроизвести ее снова. Что происходит не так?
private static readonly ConcurrentDictionary CacheList =
new ConcurrentDictionary();

public override void OnActionExecuting(HttpActionContext actionExecutingContext)
{
if (CacheList.TryGetValue(userIdentifier, out var throttleInfo))
{
if (DateTime.Now >= throttleInfo.ExpiresOn)
{
if (CacheList.TryRemove(userIdentifier, out _))
{
//TODO:
}
}
else
{
if (throttleInfo.RequestCount >= defaultMaxRequest)
{
actionExecutingContext.Response = ResponseMessageExtension
.TooManyRequestHttpResponseMessage();
}
else
{
throttleInfo.Increment();
}
}
}
else
{
if (CacheList.TryAdd(userIdentifier, new ThrottleInfo(Seconds)))
{
//TODO:
}
}
}

public class ThrottleInfo
{
private int _requestCount;

public int RequestCount => _requestCount;

public ThrottleInfo(int addSeconds)
{
Interlocked.Increment(ref _requestCount);
ExpiresOn = ExpiresOn.AddSeconds(addSeconds);
}

public void Increment()
{
// this is about as thread safe as you can get.
// From MSDN: Increments a specified variable and stores the result,
// as an atomic operation.
Interlocked.Increment(ref _requestCount);

// you can return the result of Increment if you want the new value,
// but DO NOT set the counter to the result.
// [i.e. counter = Interlocked.Increment(ref counter);]
// This will break the atomicity.
}

public DateTime ExpiresOn { get; } = DateTime.Now;
}


Подробнее здесь: https://stackoverflow.com/questions/534 ... dictionary

Вернуться в «C#»