申请开始

时间:2009-05-14 14:23:15

标签: asp.net

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();
}

1 个答案:

答案 0 :(得分:0)

您的代码不是线程安全的,双重锁定模式虽然逻辑上您可能认为它是安全的但实际上并不安全,因为您实现了它。您需要在TheFirstReq声明中添加Volatile关键字。

MSDN article显示正确实施的双重检查锁。