我正在编写一个记录服务呼叫和治疗完成的程序。我们有许多用户打开和关闭呼叫,我想始终显示今天打开的呼叫总数和今天关闭的总数以及它们之间的差异。我想用一个应用程序变量来做。我必须每天将这些变量重置为 0。我会在哪里做呢?我在 Global.asax 中想过,但在哪种情况下可以这样做?该应用程序一直在运行,所以我认为 Application_Start 不合适。那么在哪里呢?谢谢你。
4 回答
我有一个带有上次重置计数器的日期变量,并在每次访问计数器时检查日期是否为“今天”。
除非您有严重的性能问题,否则我想这就是要走的路。
每当您更新计数器时要调用的示例easy-lazy代码:
lock(myCounter)
{
if(DateTime.Now.Date != lastDateCounterWasReset)
{
lastDateCounterWasReset = DateTime.Now.Date;
myCounter = 0;
}
myCounter++;
}
现在我们需要更多地了解您希望如何存储这些变量(myCounter
和lastDateCounterWasReset
),但基本上可以在任何地方(数据库、文件系统等)
您可以在 IIS 中为应用程序池回收配置定期重启设置:
该元素包含允许您控制何时回收应用程序池的配置设置。您可以指定 Internet 信息服务 (IIS) 7 在某个时间间隔(以分钟为单位)后或在每天的特定时间回收应用程序池。您还可以将 IIS 配置为基于应用程序池中的工作进程正在使用的虚拟内存或物理内存量进行回收,或者将 IIS 配置为在工作进程处理特定数量的请求后回收应用程序池。
但这具有在池重新启动期间使应用程序脱机的副作用,因此如果您当时有任何用户连接,它将失去其会话。这可以通过在没有用户连接的时候重新启动应用程序来最小化,比如黎明时分。
以下配置片段将应用程序池设置为每天凌晨 3:00 回收:
<add name="Example">
<recycling logEventOnRecycle="Schedule">
<periodicRestart>
<schedule>
<clear />
<add value="03:00:00" />
</schedule>
</periodicRestart>
</recycling>
<processModel identityType="NetworkService" shutdownTimeLimit="00:00:30" startupTimeLimit="00:00:30" />
</add>
我会将呼叫存储到数据库中,并在当天选择哪些组以获取总呼叫等以进行显示。
这样,当新的一天开始时,它会自动为您重置,您无需担心 IIS 重置会破坏您的内存数据。
如果您不希望过于频繁地查询对性能造成影响,可以使用许多缓存选项。
我想你可以使用这个Application_BeginRequest
方法。使用布尔值查看当天是否已经运行。
另一种选择是一个带有隐藏 URL 的调度程序来重置。