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

Does the C# await can be compared to former old VB6 DoEvents?

在阅读了很多有关 await 的内容之后,我无法一直将它与 DoEvents 与以前的 VB6 语言中的循环相结合进行比较。我这样想对吗?

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

感谢您的意见!

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

的线程上

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

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

它的作用。它中断您的函数,并跳转到 VB6 运行时以清除消息队列,使您的过程可重入并将您的函数使用的值更改为其他值。然后,它调用 WinAPI sleep(0) for Windows 向所有程序发送消息。之后什么都可能发生。

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

可是太危险了

乍一看,它们在某些方面可能很相似。 DoEvents 将 运行 一个嵌套的消息循环,以允许其他方法在当前方法完成之前在该线程上 运行。类似地,await 将 "yield" 控制到其他方法,允许其他代码在当前方法完成之前 运行 在该线程上。

但是,有一个非常 非常 重要的区别。 DoEvents 保留当前调用栈;当它调用其他方法时,它会直接调用;这会导致意外重入的严重问题,并且是经常重复短语 "DoEvents is evil" 的主要原因。相比之下,awaitreturns一路向上,所以没有直接重入。

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