System.Runtime.Cache не истекает? - PullRequest
2 голосов
/ 22 марта 2011

Я реализовал решение в своем проекте ASP.NET, чтобы автоматически отправлять некоторые электронные письма на основе времени.Я сделал это с помощью System.Runtime.Cache, в частности CacheItemRemovedCallback.Прежде всего я добавляю задачу в кеш в методе Application_Start:

protected void Application_Start(object sender, EventArgs e)
{
    ...
    AddTask(reportElement.name, totalMinutes);
    ...
}

, а затем метод AddTask добавляет элемент в кеш:

private void AddTask(string name, int minutes)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, minutes, null, DateTime.Now.AddMinutes(minutes),     Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable, OnCacheRemove);
}

Так, когда запись в кешистекает через минуты, указанные в AbsolutionExpiration, он вызывает мой метод CacheItemRemoved.По сути, он запускает отчет, отправляет электронное письмо, а затем повторно добавляет задачу в кэш, поэтому он запускается снова по истечении времени - просто.Вот часть кода, который нас интересует в CacheItemRemoved.

public void CacheItemRemoved(string taskName, object minutes, CacheItemRemovedReason r)
{
    ...
    finally
    {
        AddTask(taskName, Convert.ToInt32(minutes));
    }
    ...
}

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

Это прекрасно работает на моем локальном компьютере, но когда на Windows Server2003, это в основном только один раз.Я добавил дополнительную отладку, и, похоже, во второй раз, когда добавляется запись в кэш, она просто не истекает.Я полностью застрял сейчас.Сервер Windows работает под управлением IIS 6.0.Есть ли какие-то настройки для кеша, о которых я не знаю.Кроме того, на сервере срок его действия истекает в совершенно другое время, чем указано в минутах.

Заранее спасибо.

1 Ответ

1 голос
/ 22 марта 2011
HttpRuntime.Cache.Insert(name, minutes, null, DateTime.Now.AddMinutes(minutes),     Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable, OnCacheRemove);

Когда вы добавляете свой элемент кэша, почему вы указываете CacheItemPriority.NotRemovable, это, безусловно, предотвратит удаление элемента (если у вас не хватает памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...