проверять состояние каждый период времени - PullRequest
2 голосов
/ 28 ноября 2010

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

приложение, в котором я работаю, является веб-приложением (asp.net) ..

Я не знаю, как написать патч, и я не знаю, является ли патч идеальным решением в этом состоянии или нет ..

пожалуйста, любые предложения, любые подробные объяснения по этому вопросу ..

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 28 ноября 2010

Во-первых, довольно просто настроить таймер для этой проверки. Инициализируйте таймер,

int _State;
System.Timers.Timer stateCheckTimer = new System.Timers.Timer();
stateCheckTimer.Interval = 1000; // TODO - set to desired interval (in ms)
stateCheckTimer.AutoReset = true;
stateCheckTimer.Elapsed += stateCheckTimer_Elapsed;

Затем просто проверьте свое состояние в функции stateCheckTimer_Elapsed,

void stateCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  // Check for the desired state
  if (_State == 1)
  {
    // Do something
  }
}

Самым сложным будет доступ к _State, так что вам, вероятно, придется поместить таймер в то же место, что и он (или он прошел, что бы ни работало). Я бы предложил решение, основанное на событиях, хотя. Создайте в вашем классе открытый обработчик событий, который обрабатывает состояние,

public EventHandler OnStateChanged;

Затем инкапсулируйте доступ к вашей переменной состояния (в этом примере _State), чтобы вы могли контролировать ее настройку. Когда он установлен, выключите это событие. Я делаю это через свойство,

public int State
{
  get { return _State; }
  set
  {
    _State = value;
    if (OnStateChanged != null)
    {
      OnStateChanged(this, null);
    }
  }
}

Затем вам просто нужно подключить дескриптор события для выполнения желаемого действия,

OnStateChanged += StateChangeAction;

И в этой функции выполните желаемое действие,

void StateChangeAction(object sender, EventArgs args)
{
  // Check for the desired state
  if (_State == 1)
  {
    // Do something 
  }
}

(вы должны будете передать состояние через аргументы EventArgs, но это довольно просто сделать). Таким образом, всякий раз, когда состояние изменяется, вы немедленно сможете воздействовать на него (отправлять электронную почту, делать то, что оно есть) вместо того, чтобы опрашивать состояние каждые x секунд или минут. Он будет использовать меньше ресурсов, будет быстрее реагировать (быстрее) и, в конечном итоге, будет более аккуратным кодом! Если вы можете сделать это таким образом, я очень рекомендую это.

3 голосов
/ 28 ноября 2010

эта проверка выполняется из браузера или из приложения на стороне сервера?

если это сделано из клиента (браузера), чем вы можете сделать это с помощью JavaScript См. Этот пост

Если вы хотите сделать это из кода на стороне сервера, чем, вы можете сделать это с потоком, сделать поток спящим на некоторое время, а когда он проснется, проверить состояние своего объекта

2 голосов
/ 28 ноября 2010

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

1 голос
/ 28 ноября 2010

Как насчет написания небольшого простого сервиса, который работает в фоновом режиме 24/7. Я думаю, что это самое простое решение.

...