Проблема заключается в том, что для элементов управления GUI требуется, чтобы только код, выполняющийся в том же потоке, который использовался для создания экземпляра элемента управления GUI, мог получить доступ к элементу управления GUI. Причины этого требования связаны с тем, как Windows спроектирована. Достаточно сказать, что это было бы очень трудно изменить.
InvokeRequired проверяет идентичность текущего исполняющего потока и идентичность создаваемого потока. Если они одинаковы, код может свободно взаимодействовать с элементом управления. Если нет, код должен перенаправить данные из текущего потока в поток создания экземпляра. Это медленный и дорогостоящий процесс, и его следует избегать, если это вообще возможно. Ваш код будет работать, если вы всегда вызываете, и может случиться так, что вы не заметите снижения производительности, но этот сценарий будет становиться все более распространенным по мере использования многоядерных систем. Лучше всего не создавать кодовые «узлы», которые необходимо отменить позже.