C#“事件循环”与 JavaScript“事件循环”相比如何?

use*_*283 8 javascript c# asynchronous async-await

当我听到 JavaScript 事件循环被描述为

\n\n
\n

“当无事可做时,检查队列。但只有在无事可做时才检查队列。”

\n
\n\n

在视频中https://www.youtube.com/watch?v=vMfg0xGjcOI

\n\n

例如,如果我的 JS 程序的总体是

\n\n
var x = 5.0;  \nsetTimeout(0,function(){console.log("Hey there!");});\nfor ( var i = 0; i < 10000; ++i ) x = Math.sqrt(x);\nconsole.log("x = " + x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后回调function(){console.log("Hey there!");}被放入队列中,因此将在之后执行,console.log("x = " + x);因为此时就没有什么可做的了。

\n\n

在 C# 中,据我了解(我并不真正理解),情况有所不同,因为“回调”的等效项不会等待无事可做,而是会中断其他进程(例如)。这就是我的解释

\n\n
\n

写入请求开始后一段时间,设备完成写入。它通过中断通知CPU。

\n\n

设备驱动程序\xe2\x80\x99s 中断服务例程(ISR) 响应中断。中断是 CPU 级别的事件,可暂时夺取 CPU 的控制权,使其脱离正在运行的任何线程。您可以将 ISR 视为 \xe2\x80\x9cborrowing\xe2\x80\x9d 当前正在运行的线程,但我\n 更愿意将 ISR 视为在如此低的级别上执行,\n 的概念\n xe2\x80\x9cthread\xe2\x80\x9d 不\xe2\x80\x99t 存在 - 所以它们位于 \xe2\x80\x9cbeneath\xe2\x80\x9d 所有\n 线程中,可以这么说。

\n\n

无论如何,ISR 已正确编写,因此它所做的就是告诉设备\n \xe2\x80\x9c 感谢您的中断\xe2\x80\x9d 并对延迟过程调用\n (DPC) 进行排队。

\n\n

当 CPU 不再受到中断的困扰时,它将转而使用 DPC。DPC 的执行级别也很低,以至于说 \n \xe2\x80\x9cthreads\xe2\x80\x9d 不太正确;与 ISR 一样,DPC 直接在 CPU、线程系统下的 \xe2\x80\x9c 上执行。

\n
\n\n

来自http://blog.stephencleary.com/2013/11/there-is-no-thread.html。所以如果我写了相当于

\n\n
var x = 5.0;  \nsetTimeout(0,function(){console.log("Hey there!");});\nfor ( var i = 0; i < 10000; ++i ) x = Math.sqrt(x);\nconsole.log("x = " + x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 C# 中,这会是这样的

\n\n
var x = 5.0;  \nawait SomeAsynchronousRoutine();\nfor ( var i = 0; i < 10000; ++i ) x = Math.Sqrt(x);\nConsole.WriteLine("x = {0}",x);   \n
Run Code Online (Sandbox Code Playgroud)\n\n

事实上,循环for ( var i = 0; i < 10000; ++i )可能会被中断以传递 的结果SomeAsynchronousRoutine()

\n\n

或者我完全错了,应该为在没有先做足够研究的情况下提出问题而感到羞耻吗?

\n\n

如果您必须用类似的术语来描述 C#“事件循环”

\n\n
\n

“当无事可做时,检查队列。但只有在无事可做时才检查队列。”

\n
\n\n

那么你会如何描述它呢?

\n

bri*_*bri 6

因为c#是多线程的,而JavaScript是单线程的。我想说的是有点不同。

该等待指令意味着您提供的特定六行代码在异步例程完成之前不会继续。

但是,这并不意味着所有其他代码都会挂起。当这个特定的例程放松下来时,你的主线程可以自由地运行其他代码。

考虑一下 jquery 动画。当您运行一些冗长过于复杂的代码时,它们就会停止,对吧?c# ui 则不然。如果您将冗长的代码放入 anync 任务中并正确启动它,您的 ui 动画代码可以运行而不会闪烁。

更好的是——我可以启动一堆异步任务(每个任务都冗长且麻烦),并且它们都做自己的事情(在自己的线程中),而不会互相打扰(或冻结我的用户界面,或独占 iis 请求线程, ETC)。

你上面引用的那点迟钝的“智慧”正在谈论一个更深层次的问题。它说的是“如果你有一个回调(而不是等待),CPU 如何管理中断?”

我无法想象有人关心这个问题的答案,但也许我已经明白了你问错的要点。抱歉,如果是这样的话!

希望这有帮助。