Дело в том, что СФЕРА кода.Весь обработчик событий?или просто код изменения пользовательского интерфейса.
timer.SynchronizingObject заставляет обработчик событий вызываться в потоке данного объекта.Если вы установите это в this в классе Form1, это означает, что весь ваш код для обработки события таймера выполняется тем же потоком экземпляра Form1, даже если вы создали таймер на основе потока.Так что это НИЧЕГО.ЖЕ, как окна формы таймера.
Причина, по которой вы хотите это сделать, заключается в том, что вы хотите получить доступ к элементам управления пользовательского интерфейса и внести некоторые изменения в Form1, но весь пользовательский интерфейс зависает, если вы используете таймер формы Windows.Поскольку все они выполняются в одном потоке.
Чтобы избежать этого, вы используете основанный на потоках таймер.Ваш обработчик событий вызывается в другом потоке, поступающем из некоторого пула системных потоков.Это решает проблему зависания пользовательского интерфейса.Однако это поднимает еще одну проблему.Межпоточный доступ к пользовательскому интерфейсу контролирует исключение.В некоторых версиях Visual Studio вы можете отключить эту проверку в отладочных сборках.Но вы никак не можете просто обойти эту проверку при сборке релизов.Эта проверка потока предназначена для защиты от сбоев, вызванных многопоточностью.ТОГДА вам нужно использовать все эти вещи для вызова и делегирования.
Важной частью здесь является то, что это всего лишь несколько строк кода, которые перенаправляются для запуска в потоке Form1.Не весь обработчик событий.Большая часть кода обработки событий выполняется в другом потоке.И это включает в себя такой код, как выполнение каких-либо действий в сети или на диске.
Это делает РАЗНИЦУ.
НО, все это применимо только к приложениям формы Windows.Для WPF просто используйте диспетчерский таймер.(Вот почему вы не можете найти Windows.Threading в WinForm, потому что вы не можете использовать диспетчерский таймер в WinForm, но доступны в WPF)