Application.DoEvents() 是多任务处理的一种形式吗?

Is Application.DoEvents() a form of Multitasking?

我非常确定 Applicataion.DoEvents() 在 Windows 表格中。是一种非常早期、非常原始的 WindowsForms only 形式的多任务处理。它具有所有的指示器和机制:

但我只是 运行 变成了一个 坚持 它有 "nothing to do with Multitasking" 的人,这与我对功能或多任务处理的理解不一致.

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

嗯,这叫做抢占式多任务处理,意思是 "interrupting a task"。您执行多个任务,但绝不会同时执行两个任务。它不是关于使用 CPU 的多个核心,而是一种控制程序内部多个活动的方法。 Common Sample 是,为了让程序有机会处理用户的鼠标移动,同时进行冗长的操作,运行ning 可以被视为 "batch"-job 的东西。

一般不用关心这个"DoEvents",但是如果你知道,你有一个过程运行ning超过1秒,你应该手动调用它,你通过因此,将控件转移到另一种方法,您停止自己的代码,让其他代码 运行,然后继续您自己的代码。 所以它永远不会异步,但仍然是某种 "multitasking".

它更像是一个控制结构,重要的是,你不知道里面发生了什么,你称它为 "just for case" - 其他人可能需要 CPU 一毫秒。

没有外部任务调度程序会中断您的代码并进行上下文切换,如果您做一些冗长的事情,您必须 "behave" 自己中断您的代码。按照惯例,您只能在事件处理程序中做 "small" 事情,并尽快 return 控制到 Windows,要么通过完成方法,要么通过调用 DoEvents。

I am pretty sure it is a very early, very primitive, Windows Forms only form of Multitasking

除了您推测它仅适用于 WinForms 之外,您在所有方面都非常接近正确。 "DoEvents" 在 WinForms 之前;它早在 WinForms 发明之前就存在于 Visual Basic 中,并且 "pump the message queue" 显然也先于 VB。这是一个坏主意,而且很容易被滥用。

Making the rest of said Event a continuation to be run later.

DoEvents 并没有真正像 await 那样将任何东西变成延续。当调用 DoEvents 时,当前 "in flight" 的任何事件都在堆栈上具有其状态,并且在这种情况下,堆栈是延续的实现。这是反对 DoEvents 的另一点——与 await 不同,它会占用堆栈,因此会导致溢出。

I just ran into a poster that insists it has "nothing to do with Multitasking".

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