根据Single-Threaded Application with Long-Running Calculation MSDN示例,只有1个线程可以创建响应式GUI 。感谢Dispatcher
对象,因为我们可以设置工作项的优先级。
我的问题是,在可能的情况下,在后台线程中执行简单任务(假设我们只有1个单核cpu)有什么意义?
由于
答案 0 :(得分:4)
本质上,这个例子已经打破了“尽可能多找到素数”这一单一任务,分成很多很多快速运行的单个步骤,这些步骤以非常低的优先级执行,因此它们不太可能打断用户与窗口互动。
我觉得一个缺点是它迫使程序员将任务分解成许多小步骤,我们必须保证可以快速执行。当其中一个任务正在运行时,它会在整个持续时间内阻止UI。考虑下载文件。单步连接到FTP站点可能需要20秒或更长时间,在此期间UI将被冻结。
将此与正确执行整个下载的线程进行比较,将更新编组回UI线程。即使在单核机器上,这也应该提供合理的用户体验。
下一个缺点是您现在正在单个线程上执行代码。这并不像听起来那么好。由于小型单个任务的排队方式,其他任务(任何推入窗口消息队列的任务)都有机会跳入并在其中执行。如果您的特殊任务使用的状态未被正确隔离,您可能会遇到类似线程问题的问题,但是,更糟糕的是,您无法使用锁定保护自己免受这些问题的影响动作在同一个线程上执行。使用Application.DoEvents()时也有类似的缺点,(虽然有一些额外讨厌的东西可以继续使用,但这里不能继续)。
因此,您概述的技术可能适用于某些情况,有些可能不适用。因此,我会选择一种始终适用的技术,即在后台线程上运行代码。
我认为对于大多数“使用单个线程同时保持UI响应问题”,答案通常是相同的。你不能真的。你必须咬紧牙关,学会正确穿线。仔细思考,隔离你的状态,使用不变性和锁定保护状态,并在需要的线程之间正确编组调用。