在 ASP.NET 中使用静态变量而不是应用程序状态
本文关键字:应用 程序状态 变量 静态 NET ASP | 更新日期: 2023-09-27 18:36:35
I 平面在 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);
}
...
}
如您所见,我使用自动创建的Global.asax(和代码隐藏)文件。我添加了一些静态变量和方法。我可以通过以下方式使用它们:
[some .cs file]
foreach(KeyValuePair<string, object> dictItem in Global.CacheItems)
{
...
这是正确的方法还是我应该创建新类而不是现有的全局类?如果我应该创建新类,我该怎么做以及在哪里?
> Microsoft说什么
ASP.NET 包括应用程序状态,主要是为了与 经典 ASP,以便更轻松地将现有应用程序迁移到 ASP.NET。建议将数据存储在 的静态成员中 应用程序类,而不是在应用程序对象中。这 提高性能,因为您可以更快地访问静态变量 比您可以访问应用程序字典中的项目。
参考 : http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607
我的经历
静态变量和应用程序状态之间的主要区别在于,应用程序状态在所有线程和池中都是相同的,但静态状态仅每个池相同。
经过新的测试,我看到应用程序状态变量与静态变量相同,它们只是引用应用程序上的静态变量,正如Microsoft所说,它们只是出于兼容性原因而存在
如果您有 4 个池运行您的网站(网络花园),那么您有 4 组不同的静态内存。
您的代码
关于您的代码,您尝试访问字典数据的方式存在错误,并且在真实的网络中会遇到错误。这部分代码是锁定完整字典的变量,但不锁定使用它时要进行的更改。
// this is not enough to manipulate your data !
public static Dictionary<string, object> CacheItems
{
get { lock (locker) { return cacheItems; } }
set { lock (locker) { 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; }
}
SomeFunction()
{
...
lock(locker)
{
CacheItems["VariableName"] = SomeObject;
}
...
}
另一方面,当您在应用程序状态上操作数据时,您需要使用它的全局锁Application.Lock();
并Application.UnLock();
Application.Lock();
Application["PageRequestCount"] = ((int)Application["PageRequestCount"]) + 1;
Application.UnLock();
最后得出一些结论:
避免应用程序状态,只在代码上使用静态变量。