Я бы пошел на System.Threading.Timer .Имейте в виду, что Windows не является системой ОС реального времени, поэтому время будет зависеть от того, какой механизм вы выберете.
Вы не сказали, будет ли эта функция выполнять какие-либо обновления пользовательского интерфейса., но на всякий случай вы также должны знать, что функция обратного вызова будет выполняться в другом потоке, поэтому в некоторых случаях, например, при выполнении обновлений пользовательского интерфейса, вам нужно будет выполнить соответствующее действие, чтобы перенаправить запрос обратно в поток пользовательского интерфейса.
Чтобы перенаправить запрос обратно в поток пользовательского интерфейса, вы можете сделать следующее
Для WinForms вы можете использовать Control.Invoke
Для WPF вы можете использовать Dispatcher.Invoke
Или вариант Async BeginInvoke