1

我有一个用户控件,我在该控件的 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);
}

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

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

protected override void Dispose(bool disposing)

更新 如果我通过键盘按一些文本说“LARSEN”,在按字母“L”和“A”之间会发生空闲事件吗?

4

2 回答 2

3

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

Application.Idle -= Application_Idle;

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

于 2012-05-16T05:29:02.457 回答
2

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

upd:消息循环在您的 Program.cs中启动,如下所示:

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

它处理所有消息,如鼠标移动、按键等。您可能应该在某个地方详细阅读它,可能是一本书,但是是的,在您的第一次按键被处理之后,在您按下第二个键之前很久就会出现“空闲”状态。

upd2:如果您想检测“真正的空闲”,您可能需要在此处理程序中启动(并重新启动)某种计时器,当它到期时,可能会检查 CPU 负载或类似情况,具体取决于确切的所需条件。

于 2012-05-16T04:24:14.613 回答