Индекс находился за пределами массива для переменной приложения

У меня есть веб-страница Ashx, которая делает легкий процесс обработки данных. Я измеряю длительность процесса и для каждого звонка сохраняю эту длительность в переменной приложения, чтобы потом можно было делать некоторые статистические данные (например, средняя продолжительность процесса в минуту).

var startProcess = DateTime.UtcNow;
/*
 Do some process here 
*/
var duration = DateTime.UtcNow.Subtract(startProcess).TotalMilliseconds;

// makes sure the application variable is initialized
if (HttpContext.Current.Application["ProcessSpeed"] == null)
    HttpContext.Current.Application["ProcessSpeed"] = new List<KeyValuePair<string, double>>();
// Adds speed of current process in application variable
((List<KeyValuePair<string, double>>)HttpContext.Current.Application["ProcessSpeed"]).Add(new KeyValuePair<string, double>(startProcess.ToString("HH:mm"), duration));
// makes sure we don't keep too much data in memory (remove oldest one)
if (((List<KeyValuePair<string, double>>)HttpContext.Current.Application["ProcessSpeed"]).Count > 5000) 
    ((List<KeyValuePair<string, double>>)HttpContext.Current.Application["ProcessSpeed"]).RemoveAt(0);

Все это работало отлично в течение нескольких месяцев, пока я не начал получать сообщения об ошибках, добавляющих новую длительность в массив. Ошибка:

System.IndexOutOfRangeException: индекс находился за пределами массива. в System.Collections.Generic.List`1.Add(T item) в S01Service.ProcessRequest(контекст HttpContext) в c:\inetpub\wwwroot\BigServices\S01.ashx: строка 79 в System.Web.HttpApplication.CallHandlerExecutionStepS..Web.HttpApplication.IExecutionStep.Execute() в System.Web.HttpApplication.ExecuteStep(шаг IExecutionStep, логический и завершенный синхронно)

Единственный способ вернуть это в нужное русло - это перезапустить пул IIS, так как вызовы страницы не выполняются. Тогда это может работать нормально в течение еще нескольких недель, прежде чем снова не получится.

Мои вопросы:

  • Почему индекс находится за пределами массива, когда переменная объявлена ​​в предыдущей строке (если ноль)
  • Что я делаю "хорошая практика"? Причина, по которой не используется база данных для записи продолжительности, исключительно из соображений скорости (экономия в памяти происходит мгновенно, тогда как я трачу драгоценные миллисекунды на вызов базы данных).

На всякий случай, если это актуально, эта страница вызывается около 2500 раз в минуту.

0 ответов

Другие вопросы по тегам