每次触发应用程序空闲事件

本文关键字:事件 应用程序 | 更新日期: 2023-09-27 18:34:29

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

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"之间会发生空闲事件吗?

每次触发应用程序空闲事件

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

Application.Idle -= Application_Idle;

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

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

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

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

它处理所有消息,如鼠标移动,按键等等。您可能应该在某处详细阅读有关它的内容,可能是一本书,但是是的,在处理第一次按键后,早在您按下第二个键之前,就会出现"空闲"状态。

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