Мне нужно вызывать функцию обновления БД по таймеру (раз в минуту). Делаю я это так:
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);
});
}
Вот сам таймер.
В момент запуска программы все-таки происходит обновление БД, но далее таймер не работает. В чем может быть причина?
Когда вы создаёте таймер через конструктор, принимающий параметр 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);
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости