【发布时间】:2009-04-20 18:23:39
【问题描述】:
我想知道给定时间的并发会话数。但是对于蜘蛛和负载平衡器以及可能不知道的影响,在全局 asax 中执行此操作有多安全:
void Session_Start(object sender, EventArgs e)
{
counter++;
}
void Session_End(object sender, EventArgs e)
{
counter--;
}
有什么建议吗?
【问题讨论】:
我想知道给定时间的并发会话数。但是对于蜘蛛和负载平衡器以及可能不知道的影响,在全局 asax 中执行此操作有多安全:
void Session_Start(object sender, EventArgs e)
{
counter++;
}
void Session_End(object sender, EventArgs e)
{
counter--;
}
有什么建议吗?
【问题讨论】:
至少,该解决方案存在线程问题(除了您提到的可能影响您的其他问题,我不会介绍):
应该使用Interlocked.Increment 和Interlocked.Decrement 方法而不是++ 或-- 以原子方式完成递增和递减任务。
【讨论】:
如果您将会话保存在数据库服务器或状态服务器中,则不会触发 Session_End 事件。否则,我认为应该没有问题。
此外,在递增/递减计数器时,您必须像这样获得对对象的锁定 -
lock(<some shared object>)
{
counter++;
}
您也可以尝试查看this。
【讨论】:
global.asax 应用程序对象?这是 ASP.NET 应用程序中的绝对禁忌!