Получая определенное хранилище через CacheManager.Instance.GetStore, я затем могу читать или сохранять значения. p>
Этот код предназначен для веб-приложения, работающего в IIS, и с тех пор, как я выпустил эту штуку, я заметил некоторые случайные всплески высокой загрузки ЦП, и каждый раз это начинается в то же самое время, когда IIS повторно загружает мой пул приложений. Однако не всегда, только иногда.
Примерно через 30-60 минут все возвращается в норму (может быть, IIS убивает проблемный пул?) p>
Я уверен, что это не что-то другое, использующее ЦП, я использовал окно PerformanceMonitor, чтобы отслеживать, что это за процесс, а это w3wp.exe (то есть пулы приложений IIS)Вопрос в том, действительно ли этот код может вызвать какой-либо блок?
Заметили ли вы какие-то проблемы с ним?
Код: Выделить всё
public sealed class CacheManager
{
//SINGLETON STRUCTURE
private CacheManager() { }
public static CacheManager Instance { get; } = new CacheManager();
//CLASS IMPLEMENTATION
private Dictionary stores = new Dictionary();
public Store GetStore(string storeKey)
{
if (stores.ContainsKey(storeKey) == false)
stores[storeKey] = new Store(storeKey);
if (stores[storeKey] is Store == false)
throw new InvalidCastException($"Errore cast: la tipizzazione di lettura non corrisponde a quella dello store già esistente registrato con la chiave {storeKey}");
return (Store)stores[storeKey];
}
}
public sealed class Store
{
private readonly Dictionary _cache = new Dictionary();
private readonly object _lock = new object();
private TimeSpan _defaultExpiration = TimeSpan.FromMinutes(30);
public readonly string Name;
internal Store(string name)
{
this.Name = name;
}
public bool TryGetValue(TKey key, out TValue value)
{
lock (_lock)
{
if (_cache.TryGetValue(key, out CacheItem cacheItem))
{
if (!cacheItem.IsExpired())
{
value = cacheItem.Value;
return true;
}
else
{
this.Remove(key);
}
}
value = default;
return false;
}
}
public Store SetExpiration(long seconds)
{
lock (_lock)
{
this._defaultExpiration = TimeSpan.FromSeconds(seconds);
return this;
}
}
public void AddOrUpdate(TKey key, TValue value, TimeSpan? expiration = null)
{
lock (_lock)
{
var expirationTime = expiration ?? _defaultExpiration;
_cache[key] = new CacheItem(value, DateTime.Now.Add(expirationTime));
}
}
Также я знаю, что приведенные выше классы не реализуют какую-либо систему сохранения данных между повторными циклами, но сейчас мне это не нужно.
Подробнее здесь: https://stackoverflow.com/questions/787 ... ication-po