Как получить синхронное обновление пользовательского интерфейса из шаблона InvokeRequired? - PullRequest
0 голосов
/ 16 мая 2011

У меня есть несколько потоков, чтобы добавить текст в поле расширенного текста. С Invoke () я очень легко захожу в тупик между основным потоком пользовательского интерфейса и рабочими потоками. С BeginInvoke () я получаю асинхронное обновление пользовательского интерфейса, которое мне не нужно. Я хочу, чтобы тексты появлялись в текстовом поле мгновенно, а не на более позднем этапе, который я не могу определить.

Как мне выполнить мою задачу?

Спасибо!

1 Ответ

3 голосов
/ 16 мая 2011

Вы не можете волшебным образом работать в потоке пользовательского интерфейса, не касаясь потока пользовательского интерфейса.
Если вы хотите вызвать Invoke, необходимо остановить поток пользовательского интерфейса в ожидании фоновых потоков.

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

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

...