2012-05-16 135 views
1

我有一個用戶控件,我在該控件的Load事件下注冊了空閒事件。Application.Idle事件觸發每次

Control_Load(object sender, System.EventArgs e) 
{ 
    Application.Idle += new EventHandler(Application_Idle); 
} 

我知道,當應用程序完成處理並達到空閒state.But我真的很困惑的是這裏的應用程序,進入空閒狀態,這將觸發,的確,這個用戶控件,其中handler.When我把斷點加載事件寄存器中的空閒事件每次擊中時,這意味着什麼?

例如我創建了包含此代碼

int counter = 0; 
private void Form1_Idle(object sender, System.EventArgs e) 
{ 
    counter++; 
    label1.Text = counter.ToString(); 
} 

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    Application.Idle +=new EventHandler(Form1_Idle); 
} 

然後我創建這種形式具有一定的操作按我understading標籤計數器do.As一些buttens當我在做業務應該不會增加表通過我創建的按鈕,因爲它不處於閒置狀態,但現在發生的事情是即使點擊按鈕lable計數器正在進行的一些操作正在增加,除非我按窗體標題欄並移動窗體周圍。

還有一件事我需要關閉我的窗口時分離這些事件處理程序,即使這是主應用程序窗口。如果是這樣,如果我在處置方法會做到足夠嗎?

protected override void Dispose(bool disposing) 

UPDATE 如果我按下鍵盤通過一些文字說「LARSEN」,字母「L」和不閒置事件發生時,「A」的記者之間?

回答

2

每次處理完所有消息並且沒有消息時觸發。至於處置,根據MSDN「因爲這是一個靜態事件,所以當您的應用程序被丟棄時,您必須分離事件處理程序,否則會導致內存泄漏。」 - 所以我想把它放在表單處理上(或者如果它的處理程序與表單有關的話可能在表單上關閉)就足夠了。

UPD:消息循環is started在你的Program.cs是這樣的:

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new frmMain()); 
    } 

處理所有像鼠標移動,鍵按下和很多很多更多的消息。你可能應該在某處詳細閱讀,可能是一本書,但是,是的,在第一個按鍵處理完成之後,有一個「空閒」狀態,早在你點擊第二個按鍵之前。

UPD2:如果要檢測「真正的空閒」,你可能要開始(並重新啓動),在此處理某種計時器和期滿後或許檢查CPU負載或一些這樣的,這取決於具體所需的條件。

+0

好的,那麼你的意思是什麼?這個消息隊列在哪裏。還有一件事你沒有回答我的整個問題 – vettori

2

每次應用程序有一些空閒時間時,Idle事件將被調用,而不僅僅是一次。如果你想讓它被調用一次,分離的事件處理程序大功告成後,像這樣:

Application.Idle -= Application_Idle; 

這就是你應該從事件關閉應用程序下來,以及之前分離的方式。