2011-03-24 77 views
8

我對Application.Idle事件瞭解的是應用程序正在完成其處理並且即將進入空閒狀態。Application.Idle事件的意義

我讀的地方,

如果你有線程變爲 空閒之前,你必須執行,其中附加到此事件

所以任務,這是否意味着該任務將之前進行線程變得閒置,或線程閒置之後?

我在我的項目中有一些代碼,如下所示。數據庫更新是否在空閒時間執行?

private void Application_Idle(object sender, EventArgs e) 
{ 
    // Update the explorer's menuitems 
    team.UpdateMenu(); 

    // Update display toolbars. 
    team.UpdateToolBar(); 

    // Update SaveAll 
    SaveAll.Enabled = teaj.IsModified; 

    Up.Enabled = team.CanNavigateUp; 
    ... 
+0

因此,它將意味着從數據庫獲取更新的數據,這是由於其他用戶的更新,當它處於空閒狀態時也應該完成,而不是在其他一些保存或某些其他死鎖情況的中間。 – peter 2011-03-24 05:56:48

回答

19

首先,要明白的是,Application.Idle是約「線程空閒」,但是有關應用程序的UI線程的消息處理。 (線程空閒不同於消息循環空閒)

您的WinForms應用程序由將消息拉出隊列的消息循環驅動。當該隊列被清空時,消息循環進入安靜狀態,有效休眠,直到下一條消息出現在消息隊列中。這有助於節省CPU處理資源(在循環中浪費的週期會使CPU的時間遠離機器上運行的其他進程,所以一切都會感覺更慢),並且還有助於降低功耗/延長筆記本電腦的電池壽命。

您的應用程序的消息循環通常會相當頻繁地消耗消息隊列積壓 - 即使在鍵入編輯框時的按鍵之間也是如此。

Application.Idle事件已成爲一個方便的地方,可以與應用程序的主要操作異步地處理應用程序管家雜事,並且不會涉及多個線程。

例如,當應用程序空閒時,通常啓用或禁用菜單和按鈕以匹配其相應的命令狀態。由於可見外觀只需要在用戶時間內更新(與數毫秒後更改可視狀態相比,用戶無法準確識別內部狀態更改時視覺狀態更改之間的差異),因此應用程序空閒事件爲一個簡單而有效的機會來照顧這種家務雜事。

您可以將代碼放入Winforms應用程序的Application.Idle中以檢查數據庫或網絡資源。但是,您必須小心,不要做任何需要「很長時間」的事情,因爲如果阻止Application.Idle,您的整個應用UI將凍結。使用異步呼叫而不是阻止呼叫。

另外,請記住,Application.Idle事件觸發的速度是高度可變的 - 它可能每秒觸發幾次或可能不會觸發幾秒鐘,這取決於用戶和應用程序在做什麼。如果您想要定期檢查數據更新,則應該使用計時器事件而不是Application.Idle。如果每次Application.Idle觸發時都會啓動異步網絡請求,則可能會導致服務器每秒鐘發出大量(多餘)請求。

+0

那麼爲什麼我們要把這些事件放在Application_idle中,我認爲每當有其他用戶更新這個Intranet應用程序時,我可以看到我的UI中的更改,這就是爲什麼我說數據庫更新 – peter 2011-03-24 06:22:04

+0

我們可以將什麼任務放在application_idle中事件 – peter 2011-03-24 07:09:47

+0

是的,您可以將代碼放入您的WinForms應用程序的Application.Idle中,以檢查網絡資源(數據庫)以進行數據更新。但是,您仍然必須小心不要使用阻塞調用 - 使用異步調用來避免凍結您的UI線程。 – dthorpe 2011-03-24 16:23:51