0

在启动 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 也等于falseisSomeDataUpdated变量是类的一部分(因此也是实例的一部分)。据我了解,在第一次RefreshIfFirstExecution()之后它应该总是true,对吗?我错过了什么?

更新2:

对于每个新请求,SingletonClass.Instance变为 null,但是(!)如果我在调试模式下将鼠标移到它上面,它会生成新对象(Instanceget{}方法上的断点不会触发)。我又回到了“为什么 SingletonClass.Instance 对象等于 null?”这个问题。

PS Alexey 的单例实现并没有解决这个问题

4

0 回答 0