0

我有一个 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) at S01Service.ProcessRequest(HttpContext context) in c:\inetpub\wwwroot\BigServices\S01.ashx:line 79 at System.Web.HttpApplication.CallHandlerExecutionStep.System System.Web.HttpApplication.ExecuteStep 处的 .Web.HttpApplication.IExecutionStep.Execute()(IExecutionStep 步骤,布尔值和同步完成)

回到正轨的唯一方法是在对页面的调用失败时回收 IIS 池。然后这可以在再次失败之前再正常工作几周。

我的问题:

  • 为什么在上一行声明变量时索引超出数组边界(如果为null)
  • 我在做什么是“好习惯”吗?不使用数据库记录持续时间的原因纯粹是出于速度目的(节省内存是即时的,而我会浪费宝贵的毫秒来调用数据库)。

以防万一,此页面每分钟被调用约 2500 次

4

0 回答 0