我所知道的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;
...发布于 2011-03-24 06:08:11
首先,要理解Application.Idle不是关于“线程空闲”的,而是关于应用程序UI线程上的消息处理。(线程空闲不同于消息循环空闲)
您的WinForms应用程序由消息循环驱动,该循环将消息从队列中提取出来。当该队列被清空时,消息循环进入安静状态,有效地休眠,直到下一条消息出现在消息队列中。这有助于节省CPU处理资源(循环中浪费的旋转周期会使CPU时间远离机器上运行的其他进程,因此一切都会慢下来),还有助于降低功耗/延长膝上型计算机电池寿命。
您的应用程序的消息循环通常会相当频繁地耗尽消息队列的待办事项--即使在键入编辑框时也是如此。
Application.Idle事件已经成为一个方便的地方,可以用应用程序的主要操作异步地处理应用程序的内部事务,而不必涉及多个线程。
例如,当应用程序空闲时,菜单和按钮通常被启用或禁用,以匹配其相应的命令状态。由于可视外观只需要在用户时间内更新(与更改几毫秒后的可视状态相比,用户无法准确识别内部状态更改时的视觉状态变化之间的差异),因此应用程序空闲事件是处理此类家务的简单而有效的机会。
您可以将代码放在Winforms应用程序的Application.Idle中,以检查数据库或网络资源。但是,您必须小心,不要做任何“很长时间”的事情,因为如果您阻止Application.Idle,您的整个应用程序UI将冻结。使用异步调用而不是阻塞调用。
另外,请记住,Application.Idle事件触发的速度是高度可变的--它可能每秒触发几次,也可能几秒钟内不会触发,这取决于用户和应用程序正在做什么。如果要检查定期计划中的数据更新,则应该使用计时器事件而不是Application.Idle。如果每次Application.Idle触发时启动一个异步网络请求,那么每秒就会有大量(冗余的)请求淹没服务器。
https://stackoverflow.com/questions/5415209
复制相似问题