Asp.net 应用程序启动

Asp.net 应用程序启动,asp.net,Asp.net,ASP.NET用户标识在允许写入数据库的Application.Start中不可用。网站正在共享主机上运行,因此我无法根据需要配置权限。 因此,我在global.asax中实现了以下内容。我不确定它是否完全线程安全。 我想删除委托以消除锁检查以优化性能 我想知道如果Firstreq!=null可能会失败。 谢谢 您的代码不是线程安全的,双锁模式虽然在逻辑上您可能认为它是安全的,但实际上并不像您所实现的那样安全。您需要在Firstreq Declaration上添加关键字 这显示了正确实现的双重检

ASP.NET用户标识在允许写入数据库的Application.Start中不可用。网站正在共享主机上运行,因此我无法根据需要配置权限。 因此,我在global.asax中实现了以下内容。我不确定它是否完全线程安全。 我想删除委托以消除锁检查以优化性能

我想知道如果Firstreq!=null可能会失败。 谢谢


您的代码不是线程安全的,双锁模式虽然在逻辑上您可能认为它是安全的,但实际上并不像您所实现的那样安全。您需要在Firstreq Declaration上添加关键字

这显示了正确实现的双重检查锁

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