3

我知道从另一个线程更新UI线程的技术。使用任务vs调度程序进行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(); 
    } 
    })); 
+0

如果这是一个WPF应用程序,那么没有“更好”,选择一个你喜欢的。 –

+0

您是否想等待操作完成?你想如何处理异常? – svick

+0

@svick我不想等待这个操作,并在'action'操作中处理异常。 – punker76

回答

2

从技术角度来看,我怀疑是有 '最好' 在这里。

  • 它使你的意图更加清晰,即你想要得到的东西在主UI线程
  • 上完成的,你不需要波特系列的所有任务:但是我会与调度方法去工厂选项
  • 分派器可以更容易地隐藏在接口后面一切(1)允许容易地依赖注入和单元测试

(1)见here例如

1

TaskScheduler.FromCurrentSynchronizationContext()不保证为您的UI线程返回TaskScheduler

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

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