Поскольку, если этот код запускается в потоке, отличном от того, который создал кнопку в графическом интерфейсе, возникнет исключение. Фоновые потоки не могут напрямую вызывать методы в графическом интерфейсе, поскольку графический интерфейс не является потокобезопасным.
Конечно, это просто разумная причина для использования BeginInvoke
! Но нет ничего необычного в том, чтобы найти код, который содержит заклинания или магические заклинания, которые были только что вставлены без уважительной причины, потому что автор видел другой пример, который сделал это таким образом, и поэтому предположил, что это необходимо во всех случаях. Если код, с которым вы работаете, является однопоточным, то в этом нет необходимости.
В частности, сама Windows Forms является полностью однопоточной. Все операции со всеми окнами и элементами управления происходят в одном потоке, а все их события запускаются в одном и том же потоке. Использование одного потока графического интерфейса разделяется через цикл сообщений, который непрерывно работает в потоке и читает сообщения из очереди. Цель BeginInvoke - в конечном итоге отправить сообщение в эту очередь, фактически говоря: «Если у вас есть время, пожалуйста, запустите этот кусок кода».