线程是硬件的低级抽象,而任务提供类似的异步工作,但也允许返回结果、异常管理等。默认情况下,在 Windows UI 中,您无法修改 UI 元素,除非您在创建它的线程上。BackgroundWorker 类是一个较旧的帮助类,可帮助您将结果编组回 UI 线程。
任务现在提供了一种更直接的方式来处理这个问题。在任务中执行你的工作代码,然后将更新 UI 的代码放在任务的延续中。诀窍是告诉继续在原始 UI 线程上运行,即 UI 的同步上下文。否则它将默认为先前任务的上下文(默认为线程池)
下面是一个示例,它将 DoWork() 方法作为任务执行,然后使用任务的结果更新 UI 上的 TextBlock。由于 Button_Click 是从 UI 调用的,因此它的上下文是 UI 线程。我们只需将该上下文传递给 ContinueWith() 方法以在该上下文上执行延续代码。
private void Button_Click(object sender, RoutedEventArgs e)
{
var t = Task.Run(() => DoWork());
t.ContinueWith(
// take the result of the Task and update the UI
completedTask => Output.Text = completedTask.Result.ToString()
// tell the Task Continuation to run on the original UI context
, TaskScheduler.FromCurrentSynchronizationContext()
);
}
private int DoWork()
{
return 1;
}