【问题标题】:Update UI Label when using Task.Factory.StartNew使用 Task.Factory.StartNew 时更新 UI 标签
【发布时间】:2011-08-29 21:06:38
【问题描述】:

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

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

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

如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于是 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 表示子任务可以在不同的调度程序上运行(另一个 +1 表示我 CancellationToken.None - 我一直在通过 new CancellationToken() 但它似乎是一个黑客!)
      • +1 这个解决方案很简单,我不需要在我的项目中做太多改动就可以实现它!尝试了其他一些解决方案,但无法正确实施。
      猜你喜欢
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多