2014-12-02 192 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監聽所有消息(事件)(它是操作系統中的一個真正的循環),然後它將您訂閱的事件傳遞給您的應用程序。