2014-12-02 47 views
0

很难理解事件如何真正起作用。C#事件vs循环

说我有一个循环,检查我是否每毫秒按下键盘上的字母'a'。 这与设置相同的事件有什么不同,是否必须始终进行检查以查看是否按下了键以触发事件? 它必须一直注意所有的时间造成开销就像一个循环对吗?或者它是休眠状态,这使得我不知道如何在没有经常检查的情况下触发它。

+1

答案取决于您正在处理的特定技术。在Windows窗体中(例如),我非常相信本机Windows消息处理循环比您可以编写的任何手动循环高效得多。 – 2014-12-02 19:26:06

+2

特别是如果它能够捕获按键中断,使其根本不轮询(它可能是)。不要手动做! – BradleyDotNET 2014-12-02 19:29:15

+0

底层操作系统已经有捕获输入的方式(轮询/中断),它会将事件分派到适当的应用程序窗口。你不需要重新执行自己的投票。 – Blorgbeard 2014-12-02 19:29:38

回答

1

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

在循环大小写(轮询)中,CPU始终处于活动状态,检查键盘。这使用了很多能量。如果许多程序想要了解按键并执行相同的操作,整个PC都忙于检查按键是否被按下。

另请注意:您只想检查按键每毫秒。但你怎么知道一毫秒结束?这将导致这样的循环:

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

具有这样的循环消耗100%的CPU时间(1芯)。

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

这样,您的程序就可以进入休眠状态,CPU可以执行其他操作,只要您指定的事件发生,操作系统就会唤醒您的程序。

请注意,这是一个简化的说明。细节要复杂得多。如果你想知道Windows上的细节,请阅读Mark Russinovich's Windows Internals(特别是第3章)。但请注意,即使我第二次阅读这本书,我也没有完全理解这本书。

+0

非常感谢我现在理解的每个人,如果需要,我会“阅读标记russinovich的窗口内部”以深入了解。 – noob 2014-12-02 20:05:04

2

事件是如何真正起作用的。

我猜想处理键盘事件的代码处于休眠状态。当发生一个事件时,CPU将加载一个寄存器,其中包含键盘事件处理程序的地址并运行。

没有投票。

0

你不能在你的应用程序检查多个条件和工作异步时有很多循环。 带有事件OperatingSystem监听所有消息(事件)(它是操作系统中的一个真正的循环),然后它将您订阅的事件传递给您的应用程序。