Application.Idle事件每次触发

时间:2012-05-16 04:17:53

标签: c# winforms

我有一个用户控件,我在该控件的Load事件下注册了空闲事件。

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

我知道这将在应用程序完成处理并达到空闲状态时触发。但我真的很困惑什么是空闲的应用程序,这个用户控制在哪里加载事件注册空闲事件处理程序。当我每次点击时都放置断点这意味着什么?

例如,我创建了一个包含此代码的表单

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);
}

然后我在那个形式中创建了一些具有某些操作的buttens。根据我的应用标签计数器不应该增加当我通过我创建的按钮进行操作,因为它不处于空闲状态,但现在发生的事情甚至是通过单击按钮标签计数器进行的某些操作正在增加,除非我按下表单标题栏并移动表单。

即使这是主应用程序窗口,我还需要在关闭窗口时分离这些事件处理程序。如果是这样,如果我在处置方法中就足够了吗?

protected override void Dispose(bool disposing)

更新 如果我通过键盘按某些文字说" LARSEN"在字母表之间" L"和" A"空闲事件发生了吗?

2 个答案:

答案 0 :(得分:3)

每次应用程序有空闲时间时,都会调用Idle事件,而不仅仅是一次。如果您希望它被调用一次,请在完成后分离事件处理程序,如下所示:

Application.Idle -= Application_Idle;

这也是你在关闭应用程序之前应该从事件中分离的方式。

答案 1 :(得分:2)

每次处理完所有消息时都会触发,并且没有消息。至于处理,根据MSDN"因为这是一个静态事件,所以在处理应用程序时必须分离事件处理程序,否则会导致内存泄漏。" - 所以我想在表单处理上分离它(或者如果它的处理程序与表单有关,可能在表单上关闭)就足够了。

Program.cs中的

upd:消息循环is started如下:

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

它处理所有消息,如鼠标移动,按键和批量等等。你可能应该仔细阅读它的某个地方,可能是一本书,但是,有一个"空闲"处理完第一个按键后的状态,早在您按下第二个键之前。

upd2:如果您想检测"真正空闲"你可能想在这个处理程序中启动(并重新启动)某种计时器,当它到期时可能会检查CPU负载或其他一些,具体取决于所需的条件。