使用Task.Factory.StartNew时更新UI标签

时间:2011-05-20 18:09:57

标签: c# wpf multithreading task-parallel-library

我正在尝试在我的WPF应用中使我的UI更具响应性。我使用

生成一个新线程
Task.Factory.StartNew( () => RecurseAndDeleteStart() );

在该方法RecurseAndDeleteStart()中,我想使用正在删除的文件更新UI中的标签。

如何实现这一目标?

2 个答案:

答案 0 :(得分:46)

由于它是WPF,您可以使用Dispatcher并调用Dispatcher.BeginInvoke将调用封送回UI线程以更新标签。

或者,您可以将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);

这会将回调推送回UI线程的同步上下文。

答案 1 :(得分:2)

您必须使用label.Dispatcher.BeginInvoke(delegate)从更改标签内容的其他线程调用任何内容。