Does anyone know if this code would be thread safe, or do I have to use lock when calling timer2.Change?
Timer timer1 = new Timer(timerCallback1);
Timer timer2 =
Per MSDN documentation the Timer type is thread safe, so the only place you have to be careful is where you call DoStuff();.
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).