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

Dem*_*tri 19 c# wpf multithreading task-parallel-library

我试图在我的WPF应用程序中使我的UI更具响应性.我使用生成一个新线程

Task.Factory.StartNew( () => RecurseAndDeleteStart() );
Run Code Online (Sandbox Code Playgroud)

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

如何实现这一目标?

Ree*_*sey 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) );
Run Code Online (Sandbox Code Playgroud)

然后,在您的方法内部,当您想要更新标签时,您可以:

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

这会将调用推回到UI线程的同步上下文中.