【发布时间】:2012-04-21 08:11:48
【问题描述】:
我正在尝试在后台执行一项操作,而不冻结 UI。
当然,我可以为此使用 BackgroundWorker。
但是,我只想使用 Task API 来完成。
我试过了:
async void OnTestLoaded(object sender, RoutedEventArgs e)
{
await LongOperation();
}
// It freezes the UI
和
async void OnTestLoaded(object sender, RoutedEventArgs e)
{
var task = Task.Run(()=> LongOperation());
task.Wait();
}
// It freezes the UI
那么我应该回到BackgroundWorker 吗?或者是否有仅使用任务的解决方案?
【问题讨论】:
-
为什么这么多人不喜欢BackgroundWorker?我喜欢它,直接找到语法。
-
BackgroundWorker远好于Thread,但基于Task的API 最终将占据主导地位。我有a related blog post。Task.Run具有以下优点:(1)允许嵌套; (2)取消支持使用统一的CancellationToken系统; (3) 使用正确的调用堆栈更自然地传播异常; (4) 检索结果更自然; (5) 使用更少的资源(线程池而不是专用线程)。
标签: wpf task microsoft-metro