Thread.Sleep() has some uses for which it is vital. These are few and far between, and if you're using any number higher than about 1 as the argument you almost certainly don't have one.
If it's even possible for a timer to be used instead, then you definitely don't have one. Don't block a perfectly good thread when the alternative isn't even difficult.
Do be careful of the case where a timer is triggered while the previous trigger is still running. Depending on the nature of the operation you will want to either:
Ignore this, if the code called is safe for multiple simultaneous calls then this may be fine. Of course, you have to know that it's fine.
Lock on the timer-triggered operation. Be aware that you can end up with a queue of lots of pending operations.
Lock on the timer-triggered operation, try to obtain the lock with a timeout of zero and if you fail then skip it - there's a thread still here from the last time.
Have the timer as a one-off timer that you restart at the end of each call.