使用Task vs Dispatcher进行ui线程操作

时间:2012-12-15 20:28:59

标签: wpf multithreading user-interface task-parallel-library dispatcher

我知道从另一个线程更新UI线程的技术。

所以我有这两种方法/技巧,我应该使用哪一种?

使用任务:

var uiTask = Task.Factory.StartNew(() => {
  // change something on ui thread
  var action = theActionOnUiThread;
  if (action != null) {
    action();
  }
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

使用Dispatcher:

Dispatcher.CurrentDispatcher.BeginInvoke(
  new Action(() => {
    // change something on ui thread
    var action = theActionOnUiThread;
    if (action != null) {
      action();
    }
  }));

2 个答案:

答案 0 :(得分:2)

从技术角度来看,我怀疑这里有一个“最好的”。但是我会选择调度员方法:

  • 它使你的意图更清晰,即你想在主ui线程上完成一些事情
  • 您不需要使用所有任务工厂选项
  • Dispatcher可以更容易地隐藏界面后面的所有内容(1),从而轻松实现依赖注入和单元测试

(1)例如见here

答案 1 :(得分:1)

TaskScheduler.FromCurrentSynchronizationContext()并不保证会为您提供TaskScheduler的UI线程。

实际上它有时可以返回null,虽然这些情况很少见,通常涉及在本机应用程序(例如WIX引导程序)中启动自己的调度程序。

所以我说使用调度程序版本会更安全。