【问题标题】:Is Application.DoEvents() a form of Multitasking?Application.DoEvents() 是多任务处理的一种形式吗?
【发布时间】:2020-02-16 17:44:15
【问题描述】:

我很确定 Applicataion.DoEvents() 在 Windows 窗体中。是一种非常早期、非常原始的、WindowsForms 唯一形式的多任务处理。它有所有的迹象和机制:

  • 暂停执行调用事件。
  • 使上述事件的其余部分成为稍后运行的延续。
  • 允许其他事件/进程运行。只是有一些额外的问题,因为 MT 是通过 EventQueue 实现的。甚至可能是对队列的递归调用。

但我只是遇到了一个坚持它“与多任务无关”的人,这与我对功能或多任务的理解不一致。

注意:我明确认为 Mutltithreading 只是 Multitasking 的一种实现。很明显,DoEvents() 不是多threading 的一种形式,我们都知道how poorly that one works in GUI Environments

【问题讨论】:

  • Application.DoEvents() 运行消息循环(请参阅此处的注释)。就像ShowDialog() 一样。关注内部RunMessageLoopInner(以及留在那里的注释)。另外,当然,Use of Application.DoEvents()
  • @Jimi:是的,这就是它如何实现多任务处理的。并没有真正回答我的问题。
  • 是的,确实如此。因为这只是语言的问题。你想称之为多任务吗?还是任务切换?在某种程度上,您确实将控制权交还给了系统。在某种方式。但这不是系统实现多任务的方式(我们甚至不开始谈论多线程)。所以,这只是一个选择。您想这样称呼它,以解释运行消息循环时发生的情况吗?这可能没问题,但你必须知道那里真正发生了什么。这是唯一重要的事情(IMO)。

标签: c# winforms asynchronous multitasking


【解决方案1】:

嗯,它被称为抢占式多任务,意思是“中断任务”。您执行多项任务,但绝不会同时执行两项任务。这不是关于使用 CPU 的多个内核,而是一种控制程序内部多个活动的方法。 Common Sample 是为了让程序有机会处理用户的鼠标移动,同时执行冗长的操作,运行可以被视为“批处理”作业的东西。

通常你不必关心这个“DoEvents”,但如果你知道,你有一个运行超过 1 秒的过程,你应该手动调用它,你将控制权传递给另一个方法,你停止您自己的代码,让其他代码运行,然后继续使用您自己的代码。 所以它从来都不是异步的,但仍然是某种“多任务处理”。

它更像是一个控制结构,重要的是,你不知道里面发生了什么,你称之为“以防万一”——其他人可能需要 CPU 一毫秒。

没有外部任务调度程序会中断您的代码并执行上下文切换,如果您执行冗长的操作,您必须通过自己中断代码来“表现”。按照惯例,您只在事件处理程序中做“小”事情,并尽快将控件返回给 Windows,要么通过完成方法,要么通过调用 DoEvents。

【讨论】:

    【解决方案2】:

    我很确定这是一种非常早期的、非常原始的、仅限 Windows 窗体的多任务处理形式

    除了您猜想它仅适用于 WinForms 之外,您在所有方面都非常接近正确。 “DoEvents”在 WinForms 之前;它早在 WinForms 被发明之前就出现在 Visual Basic 中,而且“泵送消息队列”显然也早于 VB。这是一个坏主意,也很容易被滥用。

    使上述事件的其余部分成为稍后运行的延续。

    DoEvents 并没有像await 所说的那样真正使任何事情成为延续。当调用 DoEvents 时,当前“正在运行”的任何事件在堆栈上都有其状态,在这种情况下,堆栈是延续的实现。这是针对 DoEvents 的另一点——与 await 不同,它吃堆栈,因此可能导致溢出。

    我刚遇到一张海报,上面坚称它“与多任务处理无关”。

    那你应该要求作者澄清,因为这听起来肯定是错误的。

    【讨论】:

    • @Christopher:与其陷入“真实”与“伪”或实现细节的杂草之中,不如考虑一种技术旨在达到的效果。如果该效果旨在实现多个独立或依赖任务的编排,那么根据某人对什么使事物“真实”的看法,它是“真实”还是“伪”多任务处理真的很重要吗?它不是。相反,应专注于了解该技术的优缺点,以及当前的技术水平。
    • “与其陷入“真实”与“伪”或实现细节的杂草之中,不如考虑一项技术旨在达到的效果。”这就是我正在做的事情。他是那个不断提出“真正的多任务”的人,好像这意味着什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2021-04-13
    • 2017-06-21
    • 1970-01-01
    相关资源
    最近更新 更多