Смысл использования метода делегата BeginInvoke () заключается в том, что цель будет работать асинхронно. Если вы вызываете EndInvoke () сразу после BeginInvoke (), то больше нет смысла его использовать. Вы получите точно такое же поведение, просто вызвав делегат напрямую, минус накладные расходы и головные боли потоков.
Значение получает обратный вызов при завершении целевого метода, асинхронно сразу после этого. Только затем вызывает EndInvoke (), он завершается немедленно. Это очищает системные ресурсы и повторно генерирует исключение, когда целевой метод его выбрасывает. Не пропускайте вызов EndInvoke (), как предложено в ответе с голосованием, вы утечете ресурсы как минимум на 10 минут.