ASP.NET用户标识在Application.Start中不可用,它允许写入数据库。 (网站在共享主机上运行,因此我无法根据需要配置权限。) 所以,我在global.asax中实现了以下内容。我不确定它是否完全线程安全。 我想删除委托以消除锁定检查以优化性能。
我想知道“if(TheFirstReq!= null)”是否会失败。 感谢
delegate void FirstRequest();
static volatile FirstRequest TheFirstReq;
static object ObjLock = new Object();
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
AppStartDateTime = DateTime.Now;
TheFirstReq = FirstReq;
}
void FirstReq()
{
lock (ObjLock)
{
if (TheFirstReq == null)
return;
TheFirstReq = null;
// Log Application start.
}
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (TheFirstReq != null)
TheFirstReq();
}
答案 0 :(得分:0)
您的代码不是线程安全的,双重锁定模式虽然逻辑上您可能认为它是安全的但实际上并不安全,因为您实现了它。您需要在TheFirstReq声明中添加Volatile关键字。
此MSDN article显示正确实施的双重检查锁。