It's "thread-safe" in the sense that the call to Change won't actually corrupt the timer.
However, it's not "thread-safe" in the sense that you definitely have a race condition (it's not possible to ensure that timerCallback2 isn't running when you're in DoStuff).