Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#await是否可以与以前的旧VB6事件相比?_C#_Vb6_Async Await - Fatal编程技术网

C#await是否可以与以前的旧VB6事件相比?

C#await是否可以与以前的旧VB6事件相比?,c#,vb6,async-await,C#,Vb6,Async Await,在阅读了很多关于wait的文章后,我无法继续将它与以前的VB6语言中的DoEvents和循环相结合进行比较。我这样想对吗 这只是让我自己对它的工作原理有了一个想法,我觉得这可能是一个很好的简单的解释(当然技术上并不准确) 谢谢你的投入 不,它们不一样DoEvents与多线程无关,它只是处理消息队列中的窗口消息,使其看起来像gui正在响应。该处理总是在调用DoEvents的线程上进行。Doevents允许VB6协同多线程处理,与CPU的多线程处理分离(如Win 16多任务处理)。您有CPU多线程的

在阅读了很多关于wait的文章后,我无法继续将它与以前的VB6语言中的DoEvents和循环相结合进行比较。我这样想对吗

这只是让我自己对它的工作原理有了一个想法,我觉得这可能是一个很好的简单的解释(当然技术上并不准确)


谢谢你的投入

不,它们不一样
DoEvents
与多线程无关,它只是处理消息队列中的窗口消息,使其看起来像gui正在响应。该处理总是在调用
DoEvents
的线程上进行。Doevents允许VB6协同多线程处理,与CPU的多线程处理分离(如Win 16多任务处理)。您有CPU多线程的所有同步问题,但它们可以在控制切换时通过正常编程解决(因此中途不会有命令被抢占),这与必须使用特殊CPU指令的CPU同步不同。CPU,因为您没有使用它的多线程,将您视为一个单线程(就像您对待CPU一样)

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

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

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


但这太危险了。

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

然而,有一个非常非常重要的区别
DoEvents
保留当前调用堆栈;当它调用其他方法时,它直接这样做;这导致了严重的问题和意外的重新进入,这是经常重复的短语“DoEvents是邪恶的”的主要原因。相反,
await
会一直向上返回,因此不存在直接重入


另外,
DoEvents
仅在UI线程上使用时与
wait
类似<代码>等待也可以在许多其他上下文中使用。

不。嗯,它们完全不同。DoEvents在.NET中仍然作为Application.DoEvents()存在,可能误解是您认为:尽管代码在等待期间暂停,但UI如何才能解除阻止?这是你的想法吗?我的想法更多的是关于操作原理的相似性,而不是关于内部。。。我想斯蒂芬·克利里在他解释的第一部分就明白了,我解释得再好不过了。很好的解释,我喜欢它,我很高兴我没有太偏离正轨。这是非常有用的,谢谢!但是
await
事实上有时也会在执行
await
的同一线程上运行处理吗?取决于同步上下文。