Почему не работает Threading.Timer?

92
15 июня 2021, 12:40

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

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

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

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

Answer 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);
}
READ ALSO
Превратить array на c# в object json

Превратить array на c# в object json

Есть такой json object:

99
Не могу настроить Sphinx под MySql

Не могу настроить Sphinx под MySql

Устанавливал и настраивал по этой инструкции https://vkcom/away

94
PDO метод execute() не работает, и ошибок не выдает

PDO метод execute() не работает, и ошибок не выдает

Всем привет, хехВообщем если не трудно подскажите в чем может быть проблема, метод execute ничего не сохраняет в БД не выдаёт ошибок и возвращает...

104