Подтвердить что ты не робот

Обновить ярлык пользовательского интерфейса при использовании Task.Factory.StartNew

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

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

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

Как это сделать?

4b9b3361

Ответ 1

Так как это WPF, вы можете использовать диспетчер и вызвать 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

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