Я не знаю, есть ли у DispatchTimer какой-нибудь умный способ сделать это, но в этой ситуации я бы не пытался заставить таймер не запускать событие, а заставить событие ничего не делать, если его нет закончил предыдущий прогон.
Для этого вы можете использовать блокировки, получив блокировку в начале вашего обработчика событий. Если блокировка недоступна, выйдите из функции (она уже работает), если вы получили блокировку, выполните работу, а затем, как только вы закончили работу, снимите блокировку.
Нужный метод: Monitor.TryEnter , и вы захотите убедиться, что вы правильно обрабатываете ошибки, как и при любом использовании блокировок.