Control.Invoke работает, только если обработка сообщений потока пользовательского интерфейса не заблокирована.Если ваш основной поток ожидает результата, вам необходимо периодически вызывать Application.DoEvents.
Относительно индикаторов выполнения Petrel: Обычно, если не разрешено взаимодействие с пользователем, используется простой индикатор выполнения, Petrel блокируется до завершения операции.в то время как один или несколько асинхронных индикаторов выполнения используются, если конечный пользователь начинает какую-либо операцию, но он может работать, когда операция выполняется в фоновом режиме.
Если вы выберете первый подход, вы можете, например, сохранить прогресс в переменной, которая видна каждому потоку (убедитесь, что переменная правильно заблокирована), и основной поток может периодически читать эту переменную в цикле и обновлятьпрогресс соответственно.