Какая разницы вызова сообщенного метода с делегатом через Invoke и BeginInvoke? Когда каждый с них должен быть использован (если есть разница в их работе)?
Delegate.Invoke - выполняется синхронно, в том же потоке.
Delegate.BeginInvoke - выполняется асинхронно, в потоке threadpool.
Когда вы хотите вызвать делегата и дождаться завершения его выполнения до продолжения текущего потока. В этих случаях вызов Invoke - это то, что нужно.
В приложениях с несколькими потоками может не потребоваться, чтобы поток ожидал, когда делегат завершит выполнение, особенно если этот делегат выполняет операции ввода-вывода (что может сделать делегат и ваш блок потоков).
В этих случаях BeginInvoke был бы полезен. Вызывая его, вы говорите делегату, чтобы начать, но затем ваш поток может свободно выполнять другие действия параллельно с делегатом.
Использование BeginInvoke повышает сложность вашего кода, но есть моменты, когда улучшенная производительность стоит сложность.