2012-02-12 1 views
1

У меня есть переменная (пользовательский объект) в одноэлементной системе, которую я хочу обновить на основе таймера.Нужна переменная singleton для обновления на основе таймера в приложении asp.net mvc

Итак, каждые 30 минут я получаю новые значения из базы данных и обновляю эту переменную. Конечная согласованность между различными серверами - это единственное, что важно - так что если один сервер имеет более старое значение, поскольку таймер однопользовательской синхронизации не синхронизируется, что не является проблемой.

Я думал о том, чтобы создать поток в одиночном конструкторе с таймером и обновить переменную на основе этого таймера.

Я не уверен, где в жизненном цикле приложения поток, начинающийся с одноэлементного, может быть прерван. Это правильный архитектурный подход к этому? Или, есть ли что-то еще, что я должен делать?

ответ

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

Это то, что может выглядеть просто на первом месте, но может стать очень сложной задачей, так как работа с recurring background tasks in ASP.NET не то, что рекомендуется сделать. Причина в том, что домен приложения может быть выгружен веб-сервером в определенных обстоятельствах, которые находятся вне вашего контроля, такие как период бездействия на сайте, некоторые пороги CPU/памяти достигнуты ... Конечно, когда ваше приложение выгруженный из памяти, все потоки, которые вы могли бы вызвать для выполнения этой фоновой задачи, просто прекратятся.

Или, есть ли что-то еще, что я должен делать?

Да, возможно, существуют другие подходы в зависимости от того, чего вы пытаетесь достичь (где и зачем вам нужна эта переменная и как она должна использоваться, ...).