Прежде всего, почему необходимо обновлять пользовательский интерфейс, который часто не замечает человеческий глаз, в идеале, даже если какой-либо прогресс обновляется с промежутком в секунду, это приемлемо. Например, если вы пишете файл и, вероятно, пишете 4 Кбайт каждые 30 миллисекунд, человеческий глаз не заметит, и мы не заботимся о производительности на экране в миллисекундах.
Не только вы сделаете поток пользовательского интерфейса занятым, но Dispatcher.Invoke также заблокирует ваш другой поток до завершения выполнения, Dispatcher.BeginInvoke не заблокирует ваш другой поток.
Поток пользовательского интерфейса, вероятно, завершит обновления за несколько миллисекунд, если он просто обновляет несколько меток или прогрессирует на экране.
Ни WPF, ни какая-либо другая платформа не могут обеспечить лучший способ, потому что пользовательский интерфейс очень сложен, и разрешение доступа из нескольких потоков может привести к взаимным блокировкам, поэтому приложение может перестать отвечать на запросы. По этой причине каждая платформа, будь то java, target-c или любая инфраструктура пользовательского интерфейса, будет нуждаться в том, чтобы вы обновляли пользовательский интерфейс только в потоке его создателя.
Однако в WPF есть способ также создавать несколько потоков пользовательского интерфейса для каждого окна, но это также довольно сложно. Игры и т. Д. Используют так называемую двойную буферизацию, когда они работают с одним буфером в фоновом режиме в отдельном потоке, в то время как предыдущий буфер все еще обновляется на экране.