C#await是否可以与以前的旧VB6事件相比?
在阅读了很多关于wait的文章后,我无法继续将它与以前的VB6语言中的DoEvents和循环相结合进行比较。我这样想对吗 这只是让我自己对它的工作原理有了一个想法,我觉得这可能是一个很好的简单的解释(当然技术上并不准确)C#await是否可以与以前的旧VB6事件相比?,c#,vb6,async-await,C#,Vb6,Async Await,在阅读了很多关于wait的文章后,我无法继续将它与以前的VB6语言中的DoEvents和循环相结合进行比较。我这样想对吗 这只是让我自己对它的工作原理有了一个想法,我觉得这可能是一个很好的简单的解释(当然技术上并不准确) 谢谢你的投入 不,它们不一样DoEvents与多线程无关,它只是处理消息队列中的窗口消息,使其看起来像gui正在响应。该处理总是在调用DoEvents的线程上进行。Doevents允许VB6协同多线程处理,与CPU的多线程处理分离(如Win 16多任务处理)。您有CPU多线程的
谢谢你的投入 不,它们不一样
DoEvents
与多线程无关,它只是处理消息队列中的窗口消息,使其看起来像gui正在响应。该处理总是在调用DoEvents
的线程上进行。Doevents允许VB6协同多线程处理,与CPU的多线程处理分离(如Win 16多任务处理)。您有CPU多线程的所有同步问题,但它们可以在控制切换时通过正常编程解决(因此中途不会有命令被抢占),这与必须使用特殊CPU指令的CPU同步不同。CPU,因为您没有使用它的多线程,将您视为一个单线程(就像您对待CPU一样)
DoEvents是一个Win16兼容的东西。它不应该被使用,它很危险,人们用它来解决想象中的问题。它会引起错误
它的作用。它会中断您的函数,并跳转到VB6运行时以清除消息队列,使您的过程可重入,并将您的函数使用的值更改为其他值。然后,它调用Windows的WinAPIsleep(0)
,向所有程序发送消息。在那之后什么都可能发生
它唯一有用的是在函数完成之前进行表单更新
但这太危险了。在某些方面,它们乍一看可能看起来很相似
DoEvents
将运行嵌套的消息循环,以允许在当前方法完成之前在该线程上运行其他方法。类似地,await
将把控制权“让给”其他方法,允许其他代码在当前方法完成之前在该线程上运行
然而,有一个非常非常重要的区别DoEvents
保留当前调用堆栈;当它调用其他方法时,它直接这样做;这导致了严重的问题和意外的重新进入,这是经常重复的短语“DoEvents是邪恶的”的主要原因。相反,await
会一直向上返回,因此不存在直接重入
另外,
DoEvents
仅在UI线程上使用时与wait
类似<代码>等待也可以在许多其他上下文中使用。不。嗯,它们完全不同。DoEvents在.NET中仍然作为Application.DoEvents()存在,可能误解是您认为:尽管代码在等待期间暂停,但UI如何才能解除阻止?这是你的想法吗?我的想法更多的是关于操作原理的相似性,而不是关于内部。。。我想斯蒂芬·克利里在他解释的第一部分就明白了,我解释得再好不过了。很好的解释,我喜欢它,我很高兴我没有太偏离正轨。这是非常有用的,谢谢!但是await
事实上有时也会在执行await
的同一线程上运行处理吗?取决于同步上下文。