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

19
我正试图在我的WPF应用程序中使UI更加响应。我使用下面的代码生成新线程:
Task.Factory.StartNew( () => RecurseAndDeleteStart() );
在那个方法RecurseAndDeleteStart()中,我想用正在被删除的文件来更新UI中的标签。如何实现这个目标?
2个回答

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
完美!正是我所寻找的。 - Demetri
1
+1 表示子任务可以在不同的调度程序上运行(另外 +1 表示向我展示了 CancellationToken.None - 我一直在传递 new CancellationToken(),但它似乎是一个 hack!) - axeman
+1 这个解决方案很简单,我在实现它时不需要改变太多我的项目。尝试了几个其他的解决方案,但无法正确实现。 - Fredrik Andersson

2

你需要使用label.Dispatcher.BeginInvoke(delegate)来调用任何会改变标签内容的不同线程中的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接