japf имеет ответ правильно. На всякий случай, если вы смотрите на многострочные действия, вы можете написать, как показано ниже.
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => {
this.progressBar.Value = 50;
}));
Информация для других пользователей, которые хотят знать о производительности:
Если ваш код ДОЛЖЕН быть написан для высокой производительности, вы можете сначала проверить, требуется ли вызов, используя флаг CheckAccess.
if(Application.Current.Dispatcher.CheckAccess())
{
this.progressBar.Value = 50;
}
else
{
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => {
this.progressBar.Value = 50;
}));
}
Обратите внимание, что метод CheckAccess () скрыт от Visual Studio 2015, поэтому просто напишите его, не ожидая, что Intellisense покажет его. Обратите внимание, что CheckAccess влияет на производительность (издержки за несколько наносекунд). Лучше всего, когда вы хотите сохранить ту микросекунду, которая требуется для выполнения «вызова» любой ценой. Кроме того, всегда есть возможность создать два метода (on с invoke, а другой без), когда вызывающий метод уверен, находится ли он в потоке пользовательского интерфейса или нет. Это самый редкий из редких случаев, когда вы должны смотреть на этот аспект диспетчера.