Вы используете серверный System.Timers.Timer , который предоставляет событие Elapsed. Вам доступны другие таймеры (например, System.Threading.Timer , где вы можете указать метод обратного вызова или Windows.Forms.Timer , где вы можете подписаться на событие Tick). поэтому вам нужно выбрать наиболее подходящий для вашего приложения и вашего варианта использования. В MSDN есть статья о том, когда использовать .NET Timer здесь
Для таймера, который вы используете, событие Elapsed будет запускаться только один раз, если оно находится в определенном состоянии. Так что это может быть вашей проблемой. От MSDN
Если для параметра «Разрешено» установлено значение «истина», а для параметра «Автосброс» установлено значение «ложь», таймер
вызывает событие Elapsed только один раз, в первый раз
истечет.
Таймер потоков будет выглядеть примерно так:
new Timer((fun _ -> YourMethod), null, 1000, 1000)
Windows.Forms.Timer будет выглядеть примерно так:
formsTimer.Tick.Add( fun _ -> YourMethod())
В WPF вам также доступен DispatcherTimer (больше здесь ). в F # это будет выглядеть примерно так:
let tmr = new DispatcherTimer(Interval = TimeSpan.FromSeconds(1.0))
tmr.Tick.Add( fun _ -> YourMethod())
tmr.Start()
Существует краткое сравнение Forms.Timer и DispatcherTimer в другом вопросе по SO , который может помочь вам выбрать правильный для вашего приложения.