使用任务vs调度程序进行UI线程操作
问题描述:
我知道从另一个线程更新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();
}
}));
答
从技术角度来看,我怀疑是有 '最好' 在这里。
- 它使你的意图更加清晰,即你想要得到的东西在主UI线程
- 上完成的,你不需要波特系列的所有任务:但是我会与调度方法去工厂选项
- 分派器可以更容易地隐藏在接口后面一切(1)允许容易地依赖注入和单元测试
(1)见here例如
答
TaskScheduler.FromCurrentSynchronizationContext()
不保证为您的UI线程返回TaskScheduler
。
事实上,它有时可能会返回null
,虽然这些情况很少见,并且通常涉及在本机应用程序(例如WIX引导程序)中启动自己的调度程序。
所以我会说使用调度版本更安全。
如果这是一个WPF应用程序,那么没有“更好”,选择一个你喜欢的。 –
您是否想等待操作完成?你想如何处理异常? – svick
@svick我不想等待这个操作,并在'action'操作中处理异常。 – punker76