This code does not run every 100 milliseconds, it waits 100 milliseconds between every iteration. Important difference.
You’re synchronously calling that code, so the next iteration of that loop will occur after
Now if this were an actual timer tick (as opposed to a
Thread.Sleep()) or the 500 ms of work would happen on a different thread, this would change.