在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。