C#“;事件循环”;与JavaScript“相比较;事件循环”;

本文关键字:相比较 循环 事件 JavaScript | 更新日期: 2023-09-27 18:29:40

我理解JavaScript事件循环的时候,我听到它被描述为

"当没有事情可做时,检查队列。但只有当没有事情做时才检查队列。"

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

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

var x = 5.0;  
setTimeout(0,function(){console.log("Hey there!");});
for ( var i = 0; i < 10000; ++i ) x = Math.sqrt(x);
console.log("x = " + x);

则回调CCD_ 1被放入队列中,因此将在CCD_

在C#中,正如我所理解的——我并不真正理解——事情是不同的,因为等效的"回调"并不是等待什么都不做,而是中断其他进程。这就是我对的理解

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

设备驱动程序的中断服务例程(ISR)响应打断中断是CPU级别的事件,暂时占用对CPU的控制,使其远离正在运行的线程。你可以将ISR视为"借用"当前正在运行的线程,但我更愿意将ISR视为在如此低的水平上执行"线"的概念并不存在,所以它们都在"下面"可以这么说。

无论如何,ISR是正确写入的,所以它所做的只是告诉设备"谢谢您的中断"并排队等待"延迟过程调用"(DPC)。

当CPU被中断所困扰时,它会四处走动到其DPC。DPC的执行级别也很低,可以说"线程"并不完全正确;与ISR一样,DPC直接在CPU,"在"线程系统下面。

来自http://blog.stephencleary.com/2013/11/there-is-no-thread.html.所以如果我写了类似的东西

var x = 5.0;  
setTimeout(0,function(){console.log("Hey there!");});
for ( var i = 0; i < 10000; ++i ) x = Math.sqrt(x);
console.log("x = " + x);

在C#中,这将类似于

var x = 5.0;  
await SomeAsynchronousRoutine();
for ( var i = 0; i < 10000; ++i ) x = Math.Sqrt(x);
Console.WriteLine("x = {0}",x);   

循环CCD_ 3实际上可以被中断以传递CCD_。

还是我完全错了,应该为没有先做足够的研究就提出问题而感到羞耻?

如果你必须用这样的术语来描述C#"事件循环"

"当没有事情可做时,检查队列。但只有当没有事情做时才检查队列。"

那么你会怎么描述呢?

C#“;事件循环”;与JavaScript“相比较;事件循环”;

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

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

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

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

更好的是,我可以启动一堆异步任务(每一个都冗长而繁琐),它们都可以(在自己的线程中)做自己的事情,而不会互相打扰(或者冻结我的ui,或者独占iis请求线程,等等)。

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

我无法想象有人关心这个问题的答案,但也许我已经理解了你问错的要点。如果是这样的话,对不起!

希望这会有所帮助。

您混淆了javascript回调和c#中的await运算符,它们不一样。回调与c#中的Action相同

你的例子完全错了。

var x = 5.0;
setTimeout(0,function(){console.log("Hey there!");});
for ( var i = 0; i < 10000; ++i ) x = Math.sqrt(x);
console.log("x = " + x);
var x = 5.0;
await SomeAsynchronousRoutine();
for ( var i = 0; i < 10000; ++i ) x = Math.Sqrt(x);
Console.WriteLine("x = {0}",x);

你需要做一些类似的事情

var x = 5.0;
Task.Run(() => {
   Console.WriteLine("Hey there!");
});
for ( var i = 0; i < 10000; ++i ) x = Math.Sqrt(x);
Console.WriteLine("x = {0}",x);

现在,C#是多线程的好处是,只要任务调度程序有空,我的回调(Action)就会被执行,可以在循环中的任何时候执行。

现在假设我想要和你在一个线程中经历的行为相同的行为;你需要做一些类似以下的事情

var x = 5.0;
var lck = new SemaphoreSlim(1);
Task.Run(async () => {
   await lck.WaitAsync();
   Console.WriteLine("Hey there!");
});
for ( var i = 0; i < 10000; ++i ) x = Math.Sqrt(x);
Console.WriteLine("x = {0}",x);
lck.Release();

不用担心,多线程环境中的异步编程很难掌握。其中一个原因,我真的喜欢高尔夫(chans,范围和选择?天哪!)。

学习SemaphoreSlim!你可以做各种各样的调用,比如创建一个AsyncQ!!!