在ASP.NET中使用静态variables而不是应用程序状态

我在飞机上使用静态variables,而不是ASP.NET中的应用程序状态,我想知道这是否是正确的方法:

[Global.asax.cs] ... public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { // Code that runs on application startup } ... private static Dictionary<string, object> cacheItems = new Dictionary<string, object>(); private static object locker = new object(); public static Dictionary<string, object> CacheItems { get { lock (locker) { return cacheItems; } } set { lock (locker) { cacheItems = value; } } } public static void RemoveCacheItem(string key) { cacheItems.Remove(key); } ... } 

正如你所看到的,我使用自动创build的Global.asax(和后面的代码)文件。 我已经添加了一些静态variables和方法。 我可以用这种方式使用它们:

 [some .cs file] foreach(KeyValuePair<string, object> dictItem in Global.CacheItems) { ... 

这是正确的方法,否则我应该创build新的类而不是现有的全球? 如果我要创build新课堂,我该怎么做,在哪里?

微软说什么

ASP.NET主要包含与经典ASP兼容的应用程序状态,以便将现有应用程序迁移到ASP.NET更为简单。 build议您将数据存储在应用程序类的静态成员中而不是应用程序对象中。 这会提高性能,因为您可以比访问应用程序字典中的项目更快地访问静态variables。

参考: http : //support.microsoft.com/default.aspx?scid=kb;en-us;Q312607

我的期盼

静态variables和应用程序状态之间的主要区别在于,所有线程和池中的应用程序状态是相同的,但每个池中的静态相同。

新的testing后,我看到应用程序的状态variables是相同的静态variables,他们只是参考应用程序的静态variables,他们只是为了兼容性的原因存在,如微软说

如果你有4个池运行你的网站(网上花园),那么你有4组不同的静态内存。

你的代码

关于你的代码,你有尝试访问你的dictionarry数据的方式的错误,你将会在真正的web中发生错误。 这部分代码是locking完整字典的variables,但不locking您在使用时所做的更改。

  // this is not enough to manipulate your data ! public static Dictionary<string, object> CacheItems { get{ lock (locker){return cacheItems; } } set{ lock (locker){cacheItems = value;} } } 

例如,正确的方法是locking所有添加/删除操作。

 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;} } SomeFunction() { ... lock(locker) { CacheItems["VariableName"] = SomeObject; } ... } 

另一方面,当您在应用程序状态上操作数据时,您需要使用它的全局lockingApplication.Lock();Application.UnLock(); 例如

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

结果是:

避免应用程序状态,只在你的代码中使用静态variables。