Timers are not accurate, just approximate. Do not use the "just add 10 minutes" logic. Each time your timer fires, you need to check the time slope and adjust it.
eg. If you say "wake me up in 10 minutes" and it wakes you up in 10 minutes 1sec, then the next timer should be 9min 59 seconds, not 10 minutes.
In addition, you want to set your next timer at the end of your logic.
eg. let's say you want to run taskA every 10 minutes, and it takes 2 seconds to start. Your timer starts, and after 10 minutes it wakes up to start taskA. It starts, ends, now you add 10 minutes. But it took 2 seconds to complete your task. Thus, 10 minutes from the moment your code is launched will be distorted for 2 seconds.
What you need to do is predict the next time you need to work, and find the difference between time and then and set a timer for that difference.
source share