使用的,而不是在ASP.NET应用程序状态的静态变量使用的,而不是在ASP.NET应用程序状态的静态

2019-05-17 13:04发布

我飞机上用静态变量,而不是在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)
{
    ...

这是正确的方式,或者我应该创建新类,而不是现有的全球? 如果我要创建新类我怎么能做到这一点,在哪里?

Answer 1:

什么微软称

ASP.NET主要包括应用程序状态与传统的ASP的兼容性,这样更容易对现有的应用程序迁移到ASP.NET。 建议您存储在应用程序类,而不是在应用程序对象的静态成员的数据。 这提高了性能,因为你能比你快可以在应用程序字典中访问某个项目访问静态变量。

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

我的expirience

静态变量和应用程序状态之间的主要不同的是,应用程序的状态是所有线程和池相同,但静态只是每个池相同。

之后新的测试我看到应用程序状态变量是一样的静态变量,他们只是引用应用一个静态变量,他们只是存在兼容性的原因,微软说

如果你有4个池运行您的网站(Web园),那么你有4套不同的静态存储器。

你的代码

关于你的代码,你有你尝试访问您的dictionarry数据的方式错误,你将要在现实的网络错误。 在这部分代码是锁定的全部字典的变量,但不锁定你去,当你使用它来进行更改。

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

要关闭一些结论:

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



文章来源: Using static variables instead of Application state in ASP.NET