3

根据具有长时间运行计算的单线程应用程序MSDN 示例,有可能仅在 1 个线程中创建响应式 GUI。感谢Dispatcher对象,因为我们可以设置工作项的优先级。

我的问题是,如果可能的话,在后台线程中执行简单任务(假设我们只有 1 个单核 cpu)有什么意义?

谢谢

4

1 回答 1

4

本质上,该示例将“找到尽可能多的素数”这一单一任务分解为许多快速运行的单独步骤,这些步骤以非常低的优先级执行,因此它们不太可能中断用户与窗户。

我觉得一个缺点是它迫使程序员将任务分解成许多小步骤,我们必须保证这些小步骤可以快速执行。当其中一项任务正在运行时,它会在整个过程中阻塞 UI。考虑下载文件。连接到 FTP 站点的单个步骤可能需要 20 秒或更长时间,在此期间 UI 被冻结。

将此与一个适当的线程进行比较,一次完成整个下载,将更新编组回 UI 线程。即使在单核机器上,这也应该提供合理的用户体验。

下一个缺点是您现在在单个线程上执行代码。这并不像听起来那么好。由于小型单个任务排队的方式,其他任务(任何推送到窗口的消息队列中)都有机会跳入并在其中执行。如果您的特殊任务使用的状态未正确隔离,您可能会遇到看起来像线程问题但实际上并非如此的问题,更糟糕的是,您无法使用 lock 保护自己免受这些问题的影响,因为所有操作都在同一个线程上执行. 使用 Application.DoEvents() 时也有类似的缺点,(尽管有一些额外的讨厌的东西可以继续,而这里不能继续)。

因此,您概述的技术可能适用于某些情况,但可能不适用于某些情况。因此,我会选择始终适用的技术,即在后台线程上运行代码。

我认为对于大多数“使用单个线程同时保持 UI 响应问题”的答案通常是相同的。你真的不能。你必须硬着头皮学会正确穿线。认真思考,隔离您的状态,使用不变性和锁定保护状态,并在需要时在线程之间正确编组调用。

于 2010-08-26T10:44:03.467 回答