Реализация кеша с использованием 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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