Обновить метку пользовательского интерфейса при использовании Task.Factory.StartNew - PullRequest
19 голосов
/ 20 мая 2011

Я пытаюсь сделать мой интерфейс более отзывчивым в моем приложении WPF.Я создаю новый поток, используя

Task.Factory.StartNew( () => RecurseAndDeleteStart() );

. В этом методе RecurseAndDeleteStart() Я хочу обновить метку в пользовательском интерфейсе с файлом, который удаляется.

Как этого добиться?

Ответы [ 2 ]

46 голосов
/ 20 мая 2011

Поскольку это WPF, вы можете использовать Dispatcher и вызвать Dispatcher.BeginInvoke, чтобы перенаправить вызов обратно в поток пользовательского интерфейса для обновления метки.

Кроме того, вы можете передать TaskScheduler в ваш метод и использовать его для обновления метки следующим образом:

// This line needs to happen on the UI thread...
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew( () => RecurseAndDeleteStart(uiScheduler) );

Затем, внутри вашего метода, когда вы хотите обновить метку, вы можете сделать:

Task.Factory.StartNew( () => 
  {
      theLabel.Text = "Foo";
  }, CancellationToken.None, TaskCreationOptions.None, uiScheduler);

Это вернет вызов обратно в контекст синхронизации потока пользовательского интерфейса.

2 голосов
/ 20 мая 2011

Вы должны использовать label.Dispatcher.BeginInvoke(delegate) для вызова чего-либо из другого потока, который изменит содержимое метки.

...