2014-10-21 3 views
0

На моем рабочем сервере у меня есть сильно используемый экземпляр SQL Server и мое приложение, которое является службой Windows C#. Мой сервис выполняет различные задания в разное время. Каждые 24 часа он отправляет электронное письмо с информацией о ходе выполнения различных заданий.MemoryCache Неожиданное выселение в C#

Код определяет, следует ли отправлять электронную почту, проверив флаг в кэше памяти. Код выглядит следующим образом: -

if (Common.MemCache.Get(Common.MemoryCacheActions.DailyEmail) == null) 
{ 
    Common.Logger.Info("Collating email data."); 
    Common.MemCache.Add(Common.MemoryCacheActions.DailyEmail, String.Empty, DateTime.Now.AddHours(24)); 

    SendEmail(); 
} 

В моих основных проверках петли для нулевой записи каждой минуты или около того, я получаю много писем. Это почти так, как если бы «Добавить» не удался или элемент был выселен?

Я читал в местах, где предметы могут быть выселены, если недостаточно памяти. Как это происходит в то время, когда это происходило, в SQL Server выполнялся сценарий обслуживания, и доступная память на ящике была в значительной степени нулевой. Я закрыл несколько программ, которые у меня были на сервере, хром, SSMS и т. Д., И больше не записывать записи в журнал или электронные письма.

Как я уже установил Истечение срока действия до + 24 часа, я ожидаю, что он добавит товар в течение 24 часов!

Каково решение здесь, нужно ли установить CacheItemPriority NotRemoveable, а затем вручную удалить элемент через 24 часа?

Вид поражения в том, как я использую свой кеш, или NotRemovable работает в тандеме с AbsoluteExpirationDate?

ответ

1

Вы можете использовать

MemoryCache.CreateCacheEntryChangeMonitor()

Создает объект CacheEntryChangeMonitor, который может вызвать события в ответ на изменения указанных записей кэша.

, чтобы узнать, удаляется ли соответствующий элемент из кеша.

Этот метод возвращает экземпляр CacheEntryChangeMonitor, метод NotifyOnChanged используется для предоставления метода обратного вызова, который вызывается при изменении кеша.

Также убедитесь, что ваша служба не перезагружается. Возможно, он сбой и перезагрузка при сбое?

0

Я думаю, что описанное поведение верное - нет договора или определения, говорящего, что элемент не может быть выведен из кеша в любое время.

Чтобы запланировать электронную почту один раз в сутки, IMHO гораздо лучше использовать, например. https://www.quartz-scheduler.net/ или любую другую библиотеку расписания по вашему выбору.

Это будет ясно показать ваши намерения.