Блокировка C # в синглтоне, вызывающая высокую загрузку ЦП, когда IIS перезапускает пул приложений?C#

Место общения программистов C#
Anonymous
Блокировка C # в синглтоне, вызывающая высокую загрузку ЦП, когда IIS перезапускает пул приложений?

Сообщение Anonymous »

У меня есть одноэлементный класс CacheManager, который обрабатывает и хранит список Store.
Получая определенное хранилище через 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

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