1

在第 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 线程上运行的任务拆分成多个部分的需要是什么?

我在这里误解了什么?

4

2 回答 2

4

我认为这里有两个不同的概念。第 1 部分讨论了在任务中运行代码以不阻塞 UI 线程。第 2 部分讨论并行运行多个任务。一个用于“不阻塞 UI 线程”,另一个用于并行完成更多事情。如果你只有两个线程:UI 线程和任务线程,事情就不会并行发生,你也没有利用并行处理的真正力量。

于 2013-04-02T11:01:44.577 回答
0

这些陈述并不矛盾,它们是一个整体。
UI线程负责刷新窗口和其中的控件,因此当您激活它们时会做出反应,用鼠标光标遍历它们等。
如果您要执行长时间运行的操作,例如for-loop具有 10000 次迭代,UI would freeze然后变得没有反应(窗口会模糊,死亡的蓝色小甜甜圈会出现)。for-loop完成后,您的 UI 将再次出现。
为了减轻 UI 线程的额外负担,您将长时间运行的任务放在单独的线程/任务中,以便它们同时执行。您UI将保持响应并接受命令(点击、击键等)。也许不相关,但正在努力解决其背后的基础知识

无论机器类型如何,用户都希望应用程序在计算时保持响应。这对不同的应用程序意味着不同的东西。对于某些人来说,这意味着提供更逼真的物理效果、更快地从磁盘或 Web 加载数据、快速呈现复杂场景并在页面之间导航、快速找到方向或快速处理数据。无论计算类型如何,用户都希望他们的应用根据他们的输入采取行动,并消除它在“思考”时出现暂停的情况。</p>

在这里阅读这篇文章。

于 2013-04-02T11:02:35.890 回答