C# await 是否可以与以前的旧 VB6 DoEvents 进行比较

本文关键字:DoEvents VB6 比较 是否 await | 更新日期: 2023-09-27 18:36:27

在阅读了很多关于等待的内容后,我无法继续将其与DoEvents与以前的VB6语言中的循环进行比较。 我的想法对吗?

这只是为了让自己了解它是如何工作的,我觉得这可能是一个很好的简单解释(当然在技术上并不准确)。

感谢您的投入!

C# await 是否可以与以前的旧 VB6 DoEvents 进行比较

在某些方面,乍一看它们可能看起来很相似。 DoEvents将运行嵌套消息循环,以允许其他方法在当前方法完成之前在该线程上运行。同样,await会将控制权"让"给其他方法,允许其他代码在当前方法完成之前在该线程上运行。

但是,有一个非常非常重要的区别。 DoEvents保留当前调用堆栈;当它调用其他方法时,它会直接这样做;这会导致意外重入的严重问题,并且是经常重复短语"DoEvents 是邪恶的"的主要原因。相比之下,await会一直向上返回,因此没有直接的重入。

此外,DoEvents仅在 UI 线程上使用时才类似于awaitawait也可以在许多其他上下文中使用。

不,它们不一样。 DoEvents与多线程无关,它只是处理位于消息队列中的窗口消息,以使其看起来像您的 GUI 是响应式的。该处理始终发生在调用DoEvents的线程上。

也许吧。Doevents 允许 VB6 协作多线程,独立于 CPU 的多线程(如 Win 16 多任务处理)。您有CPU多线程的所有同步问题,但是当您控制切换时,可以通过正常编程来解决它们(因此中途不会抢占任何命令),这与必须使用特殊CPU指令的CPU同步不同。CPU 由于您没有使用它的多线程,因此将您视为单个线程(就像您对 CPU 一样)。

DoEvents 是 Win16 兼容的东西。它不应该被使用,它是危险的,人们用它来解决想象中的问题。它会导致错误。

它的作用。它会中断您的函数,并跳转到 VB6 运行时以清除消息队列,从而使您的过程可重入,并将您的函数使用的价值更改为其他值。然后,它调用 WinAPI sleep(0) for Windows 以向所有程序提供消息。在那之后任何事情都可能发生。

它唯一有用的是在函数完成之前进行表单更新。

但这太危险了。