.NET, событие каждую минуту (по минутам). Является ли таймер лучшим вариантом? - PullRequest
39 голосов
/ 25 августа 2009

Я хочу делать вещи каждую минуту по минутам (по часам) в приложении Windows Forms, используя c #. Мне просто интересно, как лучше это сделать?

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

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

Я использую формы Windows и .Net 2.0, поэтому не хочу использовать DispatchTimer, который поставляется с .Net 3.5

Это должно быть довольно распространенная проблема. У кого-нибудь из вас есть лучший способ сделать это?

Ответы [ 14 ]

1 голос
/ 03 сентября 2009

Вы можете установить два таймера. Начальный таймер с коротким интервалом (возможно, срабатывает каждую секунду, но в зависимости от того, как точно второй таймер должен срабатывать в минуту).

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

void StartTimer()
{

  shortIntervalTimer.Interval = 1000;
  mainIntervalTimer.Interval = 60000; 

  shortIntervalTimer.Tick += 
    new System.EventHandler(this.shortIntervalTimer_Tick);
  mainIntervalTimer.Tick += 
    new System.EventHandler(mainIntervalTimer_Tick);

  shortIntervalTimer.Start();

}

private void shortIntervalTimer_Tick(object sender, System.EventArgs e)
{
  if (DateTime.Now.Second == 0)
    {
      mainIntervalTimer.Start();
      shortIntervalTimer.Stop();
    }
}

private void mainIntervalTimer_Tick(object sender, System.EventArgs e)
{
  // do what you need here //
}
0 голосов
/ 03 сентября 2009

А как насчет сочетания ответа "Аквин" и "опроса": (извинения за смесь языков)

def waitForNearlyAMinute:
    secsNow = DateTime.Now.Second;
    waitFor = 55 - secsNow;
    setupTimer(waitFor, pollForMinuteEdge)

def pollForMinuteEdge:
    if (DateTime.Now.Second == 0):
        print "Hello, World!";
        waitForNearlyAMinute();
    else:
        setupTimer(0.5, pollForMinuteEdge)
0 голосов
/ 25 августа 2009

То, что я использую для запланированных задач, - это System.Threading.Timer (System.Threading.TimerCallback, object, int, int) с обратным вызовом, установленным на код, который я хочу выполнить на основе интервала, заданного в миллисекунды для значения периода.

0 голосов
/ 25 августа 2009

Используйте таймер, установленный для запуска каждую секунду (или миллисекунду, независимо от того, какой у вас порог точности), а затем закодируйте метод для запуска вашей функциональности тогда и только тогда, когда текущее время находится в пределах этого порога после точки «в минуту» .

...