WPF UIElement может быть доступен только в одной теме.Таким образом, вы не можете получить доступ или изменить значение <Label/>
.
. Но WPF также предоставляет модель потока с именем Dispatcher
, вы можете получить Dispatcher
элемента UIElement и вызвать ваше действие в исходном потоке..
Что вам нужно сделать, это изменить MyLabel.Content=i
на MyLabel.Dispatcher.InvokeAsync(() => MyLabel.Content = i);
.
Весь код:
Task.Run(async () =>
{
int i = 1;
while (true)
{
// Note: this works because the thread slept 3000ms.
// If the thread doesn't sleep, we should declare a new variable
// so that i will not change when the action invokes.
// That means `var content = i;`
// Then `MyLabel.Dispatcher.InvokeAsync(() => MyLabel.Content = content);`
await MyLabel.Dispatcher.InvokeAsync(() => MyLabel.Content = i);
await Task.Delay(3000);
i++;
}
});
Я изменяю ваш синхронизированный вызов на асинхронныйпозвоните, и это рекомендуется.
Вы обнаружите, что Dispatcher.InvokeAsync
очень полезно, когда вы пытаетесь обновить пользовательский интерфейс в фоновом потоке.Кроме того, вы можете добавить параметр DispatcherPriority
, чтобы определить приоритет выполнения всех вызванных вами действий.