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; ... 

首先,要了解Application.Idle 不是关于“线程空闲”,而是关于应用程序的UI线程上的消息处理。 (线程空闲不同于消息循环空闲)

您的WinForms应用程序由消息循环驱动,该消息循环将消息从队列中拉出。 当该队列被清空时,消息循环进入安静状态,有效地hibernate,直到消息队列中出现下一条消息。 这有助于节省CPU处理资源(在循环中浪费的周期会使CPU时间远离机器上运行的其他进程,因此一切都会感觉更慢)并且还有助于降低功耗/延长笔记本电脑的电池寿命。

您的应用程序的消息循环通常会相当频繁地耗尽消息队列积压 – 即使在键入编辑框时按键也是如此。

Application.Idle事件已经成为一个方便的地方,可以与应用程序的主要操作异步处理应用程序管理事务,而不涉及多个线程。

例如,当应用程序空闲时,通常启用或禁用菜单和按钮以匹配其对应的命令状态。 由于可见外观仅需要在用户时间内更新(用户无法在内部状态变化时准确地辨别视觉状态变化与几毫秒后更改可视状态相比),应用程序空闲事件是一个简单而有效的机会来照顾这些家务。

您可以将代码放入Winforms应用程序的Application.Idle中以检查数据库或网络资源。 但是,您必须小心不要做任何需要“很长时间”的事情,因为如果您阻止Application.Idle,您的整个应用程序UI将会冻结。 使用异步调用而不是阻止调用。

另外,请记住,Application.Idle事件触发的速率是高度可变的 – 它可能每秒触发几次,或者可能不会触发几秒钟,具体取决于用户和应用程序正在执行的操作。 如果要定期检查数据更新,则应使用计时器事件而不是Application.Idle。 如果每次Application.Idle触发时都启动异步网络请求,则可能会使服务器每秒充满大量(冗余)请求。