使用静态字典而不是会话asp.net mvc

时间:2014-08-13 10:31:39

标签: asp.net-mvc dictionary session-variables session-state static-methods

我有会话的序列化问题(正如我所描述的here)所以我使用静态字典而不是会话asp.net mvc

public static Dictionary<string, object> FlightDict;    
FlightDict.Add("I_ShoppingClient", client); 

在这种情况下,用户将覆盖他们的值?是否有任何问题 因为他们说用静态变量用户可以覆盖数据

1 个答案:

答案 0 :(得分:2)

是的,您可以更改站点中的静态变量,但是您需要使用它来更改数据,但这还不够,您需要锁定此数据,直到完成为止。

public static Dictionary<string, object> CacheItems
    {
        get{ return cacheItems;  }    
        set{ cacheItems= value; }
    }

如何锁定?

在完成之前,您需要用来锁定添加或删除所有操作的方法是:

private static Dictionary<string, object> cacheItems = new Dictionary<string, object>();
private static object locker = new object();
public Dictionary<string, object> CacheItems
    {
        get{ return cacheItems; }   
        set{ cacheItems = value;}  
    }

YourFunction()
{  
  lock(locker)
  {
    CacheItems["VariableName"] = SomeObject;
  }  
}

要操作应用程序状态的数据,您需要使用它的全局锁Application.Lock();Application.UnLock();。即

Application.Lock();
Application["PageRequestCount"] = ((int)Application["PageRequestCount"])+1;
Application.UnLock();

最后:避免应用程序状态并使用静态变量管理应用程序中的数据以提高性能

注意:您只能在当时添加一个锁定,以便在尝试更改之前将其删除

请记住:静态变量将在请求之间共享。此外,它们将在应用程序启动时初始化,因此如果AppDomain,应用程序重新启动,它们的值将重新初始化。