Нужно обновить одноэлементную переменную на основе таймера в приложении asp.net mvc - PullRequest
1 голос
/ 12 февраля 2012

У меня есть переменная (пользовательский объект) в синглтоне, которую я хочу обновить на основе таймера.

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

Я думал о порождении потока в одноэлементном конструкторе с помощью таймера и обновлении переменной на основе этого таймера.

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

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

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

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

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

0 голосов
/ 12 февраля 2012

Почему бы просто не обновить его, когда он запрашивается, когда он устарел? Таким образом, вы не тратите время на обновление, если оно не используется. Вот так ...

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