Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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#事件与循环_C#_.net_Events - Fatal编程技术网

C#事件与循环

C#事件与循环,c#,.net,events,C#,.net,Events,很难理解事件是如何真正起作用的 假设我有一个循环,检查我是否每毫秒按一次键盘上的字母“a”。 这与设置相同的事件有何不同,它不需要一直进行检查,以查看我是否按下了键来触发事件吗? 它必须时刻注意,这会像循环一样造成开销,对吗?或者它是休眠的,这使我不知道它是如何被触发的,没有不断地检查 事件如何真正起作用 我猜处理键盘事件的代码处于休眠状态。当硬件事件发生时,CPU加载带有键盘事件处理程序地址的寄存器并运行 没有投票 事件如何真正起作用 我猜处理键盘事件的代码处于休眠状态。当硬件事件发生时,CP

很难理解事件是如何真正起作用的

假设我有一个循环,检查我是否每毫秒按一次键盘上的字母“a”。 这与设置相同的事件有何不同,它不需要一直进行检查,以查看我是否按下了键来触发事件吗? 它必须时刻注意,这会像循环一样造成开销,对吗?或者它是休眠的,这使我不知道它是如何被触发的,没有不断地检查

事件如何真正起作用

我猜处理键盘事件的代码处于休眠状态。当硬件事件发生时,CPU加载带有键盘事件处理程序地址的寄存器并运行

没有投票

事件如何真正起作用

我猜处理键盘事件的代码处于休眠状态。当硬件事件发生时,CPU加载带有键盘事件处理程序地址的寄存器并运行

没有投票

事件如何真正起作用

我猜处理键盘事件的代码处于休眠状态。当硬件事件发生时,CPU加载带有键盘事件处理程序地址的寄存器并运行

没有投票

事件如何真正起作用

我猜处理键盘事件的代码处于休眠状态。当硬件事件发生时,CPU加载带有键盘事件处理程序地址的寄存器并运行


没有轮询。

应用程序中不能有很多循环检查多个条件并异步工作。
使用events OperatingSystem侦听所有消息(事件)(它是操作系统中的一个真实循环),然后将您订阅的事件与应用程序一起传递。

应用程序中不能有很多循环检查多个条件并异步工作。
使用events OperatingSystem侦听所有消息(事件)(它是操作系统中的一个真实循环),然后将您订阅的事件与应用程序一起传递。

应用程序中不能有很多循环检查多个条件并异步工作。
使用events OperatingSystem侦听所有消息(事件)(它是操作系统中的一个真实循环),然后将您订阅的事件与应用程序一起传递。

应用程序中不能有很多循环检查多个条件并异步工作。
使用事件操作系统侦听所有消息(事件)(它是操作系统中的一个真实循环),然后将您订阅的事件与应用程序一起传递。

事件和循环(称为轮询)的区别在于性能和资源消耗

在循环情况下(轮询),CPU始终处于活动状态,检查键盘。这需要消耗很多能量。如果许多程序想知道按键的情况并做同样的事情,那么整个电脑都在忙着检查按键是否被按下

还要注意:您只需要每隔毫秒检查一次按键。但是你怎么知道一毫秒已经过去了?这将导致如下循环:

long timeBefore = timer();
long timeAfter = timeBefore;
while (timeAfter - time < 1000) // 1000 us = 1 ms
{
    timeAfter = timer();
}
long-timeBefore=timer();
长时间之后=时间之前;
而(timeAfter-time<1000)//1000 us=1毫秒
{
timeAfter=timer();
}
拥有这样一个循环会消耗100%的CPU时间(1个内核)

人们很早就认识到了这种情况,按键和计时器的滴答声都是由硬件来处理的。硬件触发一个中断。中断由操作系统处理并转换为事件。这适用于按键和定时器滴答声(以及其他事情)

这样,您的程序可以进入睡眠状态,CPU可以执行其他操作,操作系统将在您指定的事件发生时唤醒您的程序


请注意,这是一个简化的描述。细节要复杂得多。如果您想了解Windows的详细信息,请阅读(特别是第3章)。但是请注意,即使我第二次阅读这本书,我也没有完全理解它。

事件和循环(称为轮询)的区别在于性能和资源消耗

在循环情况下(轮询),CPU始终处于活动状态,检查键盘。这需要消耗很多能量。如果许多程序想知道按键的情况并做同样的事情,那么整个电脑都在忙着检查按键是否被按下

还要注意:您只需要每隔毫秒检查一次按键。但是你怎么知道一毫秒已经过去了?这将导致如下循环:

long timeBefore = timer();
long timeAfter = timeBefore;
while (timeAfter - time < 1000) // 1000 us = 1 ms
{
    timeAfter = timer();
}
long-timeBefore=timer();
长时间之后=时间之前;
而(timeAfter-time<1000)//1000 us=1毫秒
{
timeAfter=timer();
}
拥有这样一个循环会消耗100%的CPU时间(1个内核)

人们很早就认识到了这种情况,按键和计时器的滴答声都是由硬件来处理的。硬件触发一个中断。中断由操作系统处理并转换为事件。这适用于按键和定时器滴答声(以及其他事情)

这样,您的程序可以进入睡眠状态,CPU可以执行其他操作,操作系统将在您指定的事件发生时唤醒您的程序


请注意,这是一个简化的描述。细节要复杂得多。如果您想了解Windows的详细信息,请阅读(特别是第3章)。但是请注意,即使我第二次阅读这本书,我也没有完全理解它。

事件和循环(称为轮询)的区别在于性能和资源消耗

在循环情况下(轮询),CPU始终处于活动状态,检查键盘。这需要消耗很多能量。如果许多程序想知道按键的情况并做同样的事情,那么整个电脑都在忙着检查按键是否被按下

还要注意:您只需要每隔毫秒检查一次按键。但是你怎么知道一毫秒已经过去了?这将导致如下循环:

long timeBefore = timer();
long timeAfter = timeBefore;
while (timeAfter - time < 1000) // 1000 us = 1 ms
{
    timeAfter = timer();
}