我想在应用程序启动时实例化一个对象,并希望在应用程序结束或我手动更新它之前对其进行维护。
我以为我可以用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状态为空。
答案 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移到了外面,现在一切正常。