Initially I thought you were asking why this is not sleeping for exactly a minute. My bad.
Let say that now is 12:15:30.91.
After calling Truncate you get 12:15:30.00.
Now you Add 1 minute: 12:16:30.00.
Now you Sub now: 00:00:59.09.
Since you are waking up < 1 ms too early, I doubt this is due to the overhead of the computation and the mechanism used to manage timers. If anything you would be waking up too late. I also doubt it’s because of the monotonic clock, but it’s possible. What kind of hardware is this running on?
Just out curiosity, what you do get if you use the time sent on the channel instead of time.Now()?
Notice when you do your computation when now is 14:39:59.99, truncate returns 14:39:59.00, you add a minute to get 14:40:00, substract now to get 00:00:00.001 and that’s for how long you wait, so you wake up again after one millisecond. The fact that you manage to squeeze in the call to Reset before the next millisecond elapses is astounding