Саймон на самом деле не ошибается.
BeginInvoke
- это все равно, что отправить сообщение в ветку пользовательского интерфейса и сказать: «Сделайте это, как только у вас появится возможность».
Invoke
все равно что сказать: «Сделай это прямо сейчас . Я подожду».
Разъяснение: только потому, что вы говорите потоку пользовательского интерфейса: «Сделайте это прямо сейчас», это не означает, что вы являетесь Богом потока пользовательского интерфейса и можете заставить его отказаться от всего, что он делает , По сути, ключевыми словами в приведенном выше утверждении являются «Я подожду».
Дело в том, что в вашем примере кода сообщение, которое вы отправляете в поток пользовательского интерфейса: call MessageBox.Show
. Угадай, что? Это в любом случае заблокирует поток пользовательского интерфейса.
Если вы хотите заметить асинхронное поведение BeginInvoke
, вызовите его из отдельного потока, установите точку останова после вызова BeginInvoke
в своем коде и обратите внимание, что точка останова срабатывает даже во время отображения окна сообщения (и пользовательский интерфейс заблокирован). Если вы наберете Invoke
, код не будет продолжаться, пока пользователь не закроет окно сообщения.