Это зависит от того, что вы хотите сделать. Если вы хотите (более) точный метод, вы можете использовать System.Threading.Timer . Одна вещь о thread.sleep состоит в том, что это действительно "sleepatleastuntil ...". Процессор будет игнорировать ваш поток, пока не закончится время ожидания. В следующий раз, когда он даст приоритет вашему потоку, по истечении времени ожидания он будет.
Обычно это будет очень близко к желаемому интервалу, но может быть и дольше. Не сдавайтесь, если вы действительно не намерены уступать.