整个应用程序的C#ASP .NET全局变量

时间:2016-01-06 05:35:28

标签: c# asp.net static global-variables

我想在应用程序启动时实例化一个对象,并希望在应用程序结束或我手动更新它之前对其进行维护。

我以为我可以用public static class来做,但它不起作用。如果我创建这个类:

public static class MyGlobalClass
{
   private static object _MyObject;

   static MyGlobalClass
   {
       _MyObject = new object();
   }

   public static object GetObject()
   {
       return _MyObject;
   }
}

我创建了一个aspx页面,如:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        object obj = MyGlobalClass.GetObject();
    }
}

如果我调试这个例子,在每次请求时都会调用静态构造函数,因此每次都会初始化对象_MyObject,而不是像我想的那样初始化。

在我的情况下,对象的初始化是昂贵的,所以我想只实例化一次,只想手动更新它。

我是否必须告诉ASP .NET将public static class保留在内存中?似乎ASP .NET在每次请求后抛出整个类MyGlobalClass

更新

即使Application状态始终为空:

public static class MyGlobalClass
{
   private static object _MyObject;

   static MyGlobalClass
   {
      if(HttpContext.Current.Application["MyObject"] != null)
      {
          _MyObject= (object)HttpContext.Current.Application["MyObject"];  
          return;  
      }
      _MyObject = new object();
      HttpContext.Current.Application["MyObject"] = _MyObject;
   }

   public static object GetObject()
   {
       return _MyObject;
   }
}

在每个请求中,Application状态为空。

2 个答案:

答案 0 :(得分:-1)

有一个名为Singleton的模式,这可能会对你有帮助。

public class MyGlobalClass
{
    private static MyGlobalClass _instance;
    private static object _myObject;

    protected MyGlobalClass()
    {
        if (HttpContext.Current.Application["MyObject"] != null)
        {
            _myObject = (object)HttpContext.Current.Application["MyObject"];
            return;
        }
        _myObject = new object();
        HttpContext.Current.Application["MyObject"] = _myObject;
    }

    public static MyGlobalClass GetInstance()
    {
        if (_instance == null)
        {
            _instance = new MyGlobalClass();
        }
        return _instance;
    }

    public static object GetObject()
    {
        return _myObject;
    }
}

您只需要调用GetInstance()方法来实例化MyGlobalClass的新对象。

答案 1 :(得分:-1)

我现在开始工作,但我认为这不是一个好方法:

我必须在我的Global.asax文件中保留静态变量:

public class Global : System.Web.HttpApplication
{
   public static object MyObject { get; private set; }

   protected void Application_Start(object sender, EventArgs e)
    {
        MyObject = new object();
    }
}

现在我可以使用Global.MyObject访问该对象。奇怪的是,这应该与自定义静态类的第一个示例相同,但自定义静态类总是被丢弃。

最后一个奇怪的事情是为什么Application_Start方法被调用3次。我将Applicationpool的高级设置中的Workerprocesses设置为1,所以我不明白为什么Application_Start被调用3次。

无论如何它正在工作,对象被初始化3次,因为Application_Start被调用3次,但之后,它可以在不重新创建的情况下使用。如果我需要重新创建它,我可以使用Global.asax中的静态方法手动完成。

更新

问题很简单,但之前我不知道: 每次bin文件夹中的更改时,IIS都会重新启动Apppool。我为全局变量创建了一个新的AppDomain,其中ShadowCopy启用了缓存文件夹作为bin中的子文件夹。因此,每当我创建AppDomain bin文件夹已更改且Apppool重新启动时,所以Application_Start被多次调用。我将缓存目录从bin移到了外面,现在一切正常。