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" 的主要原因。相比之下,await
returns一路向上,所以没有直接重入。
此外,DoEvents
仅在用于 UI 线程时类似于 await
。 await
也可以在许多其他情况下使用。
在阅读了很多有关 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" 的主要原因。相比之下,await
returns一路向上,所以没有直接重入。
此外,DoEvents
仅在用于 UI 线程时类似于 await
。 await
也可以在许多其他情况下使用。