0

Мне нужно вызывать функцию обновления БД по таймеру (раз в минуту). Делаю я это так:

static void Main(string[] args)
        {
            Work.Program.GetTimer();
            ....
        }

Вот из мейна включаю таймер.

public static async void GetTimer()
        {
            await Task.Run(() =>
            {
                var startTimeSpan = TimeSpan.Zero;
                var periodTimeSpan = TimeSpan.FromMinutes(1);

                var timer = new System.Threading.Timer((e) =>
                {
                    GetOnlineBD();
                }, null, startTimeSpan, periodTimeSpan);
            });
        }

Вот сам таймер.

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

1 Answers1

1

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

И да, не надо смешивать разные способы создания таймеров.

Таким образом, основной способ создания таймера - вот такой:

static System.Threading.Timer timer;

// ...

timer = new System.Threading.Timer((e) =>
{
    GetOnlineBD();
}, null, startTimeSpan, periodTimeSpan);

Альтернативный способ - можно использовать асинхронные задержки и никаких таймеров:

await Task.Delay(periodTimeSpan);
while (true) {
    GetOnlineBD();
    await Task.Delay(startTimeSpan);
}
Pavel Mayorov
  • 58,537
  • Едиснтвенное, надо быть осмотрительными с бесконечными циклами, они могут удерживать ресурсы. Плюс, ЕМНИП, таймер не ждет окончания предыдущего вызова для нового вызова. Ну и в цикле интервал будет включать не только ожидание, но и время работы вызываемой фукнции. То есть альтернативный вариант немного отличается от простого таймера по логике. – tym32167 Aug 23 '19 at 12:30
  • @tym32167 это да, но обычно разница всё же невелика: в таких циклах полезная нагрузка по длительности, как правило, заметно короче чем длительность паузы. – Pavel Mayorov Aug 23 '19 at 12:40
  • я не спорю, просто немного дополнил ответ. По идее в проде тут надо и время засекать на полезную нагрузку и предусмотреть прерывание цикла. Я это как то с @VladD уже обсуждал – tym32167 Aug 23 '19 at 12:43