Нет, вам не нужно звонить.На самом деле вы не должны: -)
Вы должны вызывать EndInvoke только для завершения асинхронного вызова, ранее начатого с помощью вызова BeginInvoke.
В предоставленном вами коде вы выполняете делегат синхронноиз потока ThreadPool.
Этот подход очень хорош, если у вас есть требование "забей и забудь".Однако, если вам нужно извлечь выходные данные из вызова, было бы лучше использовать BeginInvoke с последующим EndInvoke.