在第 1 部分“入门”中
- 亚历山德拉鲁西娜的系列。.NET Framework 4 中的并行编程
为了使 WPF UI 具有响应性,它是通过将密集的计算外包到 UI 之外来完成的。最终,代码改为:
for (int i = 2; i < 20; i++)
{
var t = Task.Factory.StartNew(() =>
{
var result = SumRootN(i);
this.Dispatcher.BeginInvoke(new Action(() =>
textBlock1.Text += "root " + i.ToString() + " " +
result.ToString() + Environment.NewLine)
,null);
});
}
更新:因此将密集计算从 UI 线程中移出。
以下是第1 部分文章中的引语:
- “为了让 UI 具有响应性,我将使用任务,这是任务并行库引入的一个新概念。任务代表一种异步操作,通常在单独的线程上运行”
- “编译、运行……嗯,UI 是响应式的”
并且为了从那些单独的任务线程输出到 WPF UI(或避免 InvalidOperationException 说“调用线程无法访问此对象,因为不同的线程拥有它。”)使用了 Dispatcher.BeginInvoke()。
同一系列“并行编程:任务调度程序和同步上下文”的第 2 部分讲述了相同的代码片段(在引入局部迭代变量的小改动之后):
“这个需要更彻底的重构。我不能在 UI 线程上运行所有任务,因为它们执行长时间运行的操作,这会使我的 UI 冻结。此外,它将取消所有并行化的好处,因为只有一个用户界面线程。
我能做的就是把每个任务拆分成……”
part1-article与part2-article不矛盾吗?
将不在 UI 线程上运行的任务拆分成多个部分的需要是什么?
我在这里误解了什么?