Вы не можете волшебным образом работать в потоке пользовательского интерфейса, не касаясь потока пользовательского интерфейса.
Если вы хотите вызвать Invoke
, необходимо остановить поток пользовательского интерфейса в ожидании фоновых потоков.
Однако вам следует просто позвонить BeginInvoke
.
BeginInvoke
не менее мгновенно, чем Invoke
; единственное отличие состоит в том, что Invoke
заставляет вызывающий поток ждать, пока поток пользовательского интерфейса не сможет запустить делегат.
Вы бы вызвали Invoke
, если фоновый поток должен ждать, пока поток пользовательского интерфейса запустит делегат (например, если он возвращает значение).
В обычных случаях вы всегда должны звонить BeginInvoke
; обычно нет смысла заставлять фоновый поток ждать, пока поток пользовательского интерфейса не освободится.