需要基于asp.net mvc应用程序中的计时器更新singleton变量

时间:2012-02-12 04:37:14

标签: c# asp.net-mvc singleton application-lifecycle

我在一个单例中有一个变量(自定义对象),我想根据计时器进行更新。

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

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

我不确定应用程序生命周期中从单例开始的线程可以终止。这是正确的架构方法吗?或者,我还应该做些什么吗?

2 个答案:

答案 0 :(得分:3)

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

  

或者,我还应该做些什么吗?

是的,可能还有其他方法取决于你想要达到的目标(你需要这个变量的位置和原因,以及它应该如何使用,......)。

答案 1 :(得分:0)

为什么不在它过期后请求更新呢?这样,如果没有使用它,你不会浪费时间更新它。像这样......

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;
        }
    }
}