Сам писал, и в коде других встречал следующую конструкцию для периодического запуска обработчиков:
while(true){
...
Thread.Sleep(время);
}
вместо использования TimeOut. (Ну и как правило в предикате всё-же стоит булева переменная, что-то вроде stop, но это сути не меняет.)
Есть ли здесь какие-либо «подводные камни»? Понятно что есть сдвиг по времени (так коду нужно некоторое время на выполнение, поэтому точное время промежутков между исполнения, как по таймеру не получим).
Какие-нибудь ещё отличия?
Если время больше int.MaxValue / 4, то поток имеет все шансы так и не проснуться. Не уверен, является ли это подводным камнем, но лично я однажды на это напоролся.
Кроме того, при фиксированных промежутках реальная частота может очень сильно просесть на загруженной системе.
Ну и тот факт, что такой код занимает целый поток, игнорировать не стоит.