需要根据 asp.net mvc 应用程序中的计时器更新单例变量

Posted

技术标签:

【中文标题】需要根据 asp.net mvc 应用程序中的计时器更新单例变量【英文标题】:Need singleton variable to be updated based on a timer in asp.net mvc application 【发布时间】:2012-02-12 04:37:13 【问题描述】:

我想根据计时器更新单例中的变量(自定义对象)。

因此,每 30 分钟我会从数据库中获取新值并更新此变量。 不同服务器之间的最终一致性是唯一重要的事情 - 因此,如果一个服务器具有较旧的值,因为单例计时器未同步,这不是问题。

我正在考虑使用计时器在单例构造函数中生成一个线程,并根据该计时器更新变量。

我不确定在应用程序生命周期中的哪个位置可以终止从单例启动的线程。这是正确的架构方法吗?或者,还有什么我应该做的吗?

【问题讨论】:

【参考方案1】:

这可能看起来很容易,但可能会变得非常复杂,因为不建议使用recurring background tasks in ASP.NET。原因是 Web 服务器可能会在您无法控制的某些情况下卸载应用程序域,例如站点上一段时间不活动,达到某些 CPU/内存阈值,......当然,当您的应用程序处于从内存中卸载您可能为执行此后台任务而生成的所有线程都将停止。

或者,我还有什么需要做的吗?

是的,可能还有其他方法,具体取决于您要实现的目标(您需要此变量的位置和原因以及应该如何使用它,...)。

【讨论】:

【参考方案2】:

当它过期后,为什么不直接更新它呢?这样,如果不使用它,您就不会浪费时间更新它。像这样……

public class MyClass

    private static MyClass sInstance
    private static DateTime sInstanceLastUpdated = DateTime.MinValue;
    public static MyClass Instance
    
        get
        
            if(sInstance == null || DateTime.Now.Subtract(sInstanceLastUpdated).TotalMinutes > 30)
            
                sInstance = new MyClass();
                // initialize.
            
            return sInstance;
        
    

【讨论】:

以上是关于需要根据 asp.net mvc 应用程序中的计时器更新单例变量的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET开发实战——ASP.NET MVC & 分层 代码篇

ASP.NET MVC 中的 jQuery 与 MicrosoftAjax

如何根据 asp.net mvc4 中的模型列表填充 ListBox?

ASP.NET MVC - 根据用户角色获取数据库数据

ASP.NET MVC

如何在 ASP.NET Core 2.1 中的计时器上运行 BackgroundService