编程语言
首页 > 编程语言> > 调度程序与多线程

调度程序与多线程

作者:互联网

根据Single-Threaded Application with Long-Running Calculation MSDN示例,有可能仅在1个线程中创建响应式GUI.感谢Dispatcher对象,因为我们可以设置工作项的优先级.

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

谢谢

解决方法:

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

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

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

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

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

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

标签:multithreading,priority-queue,dispatcher,c
来源: https://codeday.me/bug/20191105/1998225.html