С# Разница Invoke и BeginInvoke у делегатов?


#1

Какая разницы вызова сообщенного метода с делегатом через Invoke и BeginInvoke? Когда каждый с них должен быть использован (если есть разница в их работе)?


#2

Delegate.Invoke - выполняется синхронно, в том же потоке.
Delegate.BeginInvoke - выполняется асинхронно, в потоке threadpool.

Когда вы хотите вызвать делегата и дождаться завершения его выполнения до продолжения текущего потока. В этих случаях вызов Invoke - это то, что нужно.

В приложениях с несколькими потоками может не потребоваться, чтобы поток ожидал, когда делегат завершит выполнение, особенно если этот делегат выполняет операции ввода-вывода (что может сделать делегат и ваш блок потоков).

В этих случаях BeginInvoke был бы полезен. Вызывая его, вы говорите делегату, чтобы начать, но затем ваш поток может свободно выполнять другие действия параллельно с делегатом.

Использование BeginInvoke повышает сложность вашего кода, но есть моменты, когда улучшенная производительность стоит сложность.