在启动 ASP.NET MVC 应用程序后,我只需要进行一次更新。我创建了单例实例:
public sealed class SingletonClass
{
private static readonly Object s_lock = new Object();
private static SingletonClass instance = null;
private SingletonClass()
{ }
public static SingletonClass Instance
{
get
{
if (instance != null) return instance;
Monitor.Enter(s_lock);
SingletonClass temp = new SingletonClass();
temp.isSomeDataUpdated = false;
Interlocked.Exchange(ref instance, temp);
Monitor.Exit(s_lock);
return instance;
}
}
private bool isSomeDataUpdated;
public void RefreshIfFirstExecution()
{
if (!isSomeDataUpdated)
{
isSomeDataUpdated = true;
Refresh();
}
}
private void Refresh() { ... }
}
并尝试执行它的RefreshIfFirstExecution()方法,首先从Global.asax --> Application_Start()方法,然后从Startup.cs --> Configuration(),甚至从BaseController的构造函数。但是我遇到了同样的问题:显示主页后,当我尝试导航任何下一页时,我的实例对象再次等于null。
我做错了什么以及如何在应用程序启动后只执行一次Refresh()方法?
更新
当我改变调用方式时,实例开始包含对象:
SingletonClass.Instance.RefreshIfFirstExecution();
至
var singletonRefresher = SingletonClass.Instance;
singletonRefresher.RefreshIfFirstExecution();
但即使在第一次执行RefreshIfFirstExecution()方法(将其设置为true )之后isSomeDataUpdated 也等于false。isSomeDataUpdated变量是类的一部分(因此也是实例的一部分)。据我了解,在第一次RefreshIfFirstExecution()之后它应该总是true,对吗?我错过了什么?
更新2:
对于每个新请求,SingletonClass.Instance变为 null,但是(!)如果我在调试模式下将鼠标移到它上面,它会生成新对象(Instance的get{}方法上的断点不会触发)。我又回到了“为什么 SingletonClass.Instance 对象等于 null?”这个问题。
PS Alexey 的单例实现并没有解决这个问题