我想根据计时器更新单例中的变量(自定义对象)。
因此,每 30 分钟我会从数据库中获取新值并更新此变量。不同服务器之间的最终一致性是唯一重要的事情 - 因此,如果一个服务器具有较旧的值,因为单例计时器未同步,这不是问题。
我正在考虑使用计时器在单例构造函数中生成一个线程,并根据该计时器更新变量。
我不确定在应用程序生命周期中的哪个位置可以终止从单例启动的线程。这是正确的架构方法吗?或者,还有什么我应该做的吗?
我想根据计时器更新单例中的变量(自定义对象)。
因此,每 30 分钟我会从数据库中获取新值并更新此变量。不同服务器之间的最终一致性是唯一重要的事情 - 因此,如果一个服务器具有较旧的值,因为单例计时器未同步,这不是问题。
我正在考虑使用计时器在单例构造函数中生成一个线程,并根据该计时器更新变量。
我不确定在应用程序生命周期中的哪个位置可以终止从单例启动的线程。这是正确的架构方法吗?或者,还有什么我应该做的吗?
这首先看起来很容易,但可能会成为非常复杂的任务,因为不建议在 ASP.NET 中处理重复的后台任务。原因是 Web 服务器可能会在您无法控制的某些情况下卸载应用程序域,例如站点上一段时间不活动,达到某些 CPU/内存阈值,......当然,当您的应用程序处于从内存中卸载您可能为执行此后台任务而生成的所有线程将简单地停止。
或者,还有什么我应该做的吗?
是的,可能还有其他方法,具体取决于您要实现的目标(您需要此变量的位置和原因以及应该如何使用它,...)。
为什么不在它过期后立即更新它呢?这样,如果不使用它,您就不会浪费时间更新它。像这样...
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;
}
}
}