Основываясь на ответе Джона Скита, бывают случаи, когда вы хотите вызвать делегата и дождаться его выполнения до завершения текущего потока. В этих случаях вызов Invoke - это то, что вы хотите.
В многопоточных приложениях вам может не потребоваться, чтобы поток ожидал делегата, чтобы завершить выполнение, особенно если этот делегат выполняет ввод / вывод (что может сделать делегат и ваш поток блокированным).
В этих случаях было бы полезно BeginInvoke. Вызывая его, вы приказываете делегату начать, но тогда ваш поток может делать другие вещи параллельно с делегатом.
Использование BeginInvoke увеличивает сложность вашего кода, но бывают случаи, когда улучшенная производительность оправдывает себя.