Winforms: Application.Idle不能在非UI线程里注册

一、现象描述

如果我们在一个非UI线程里为事件(EventApplication.Idle注册一个处理器(Handler),我们将发现该事件处理器不会被调用到。

二、问题重现

1. Visual Studio中创建一个Winforms工程;

2. 添加Application.Idle的事件处理器的代码:

private static void Application_Idle(object sender, EventArgs args)

{

MessageBox.Show("Application is idle.", "Info");

}

3. 创建一个任务线程,并在该线程里为事件Application.Idle注册一个处理器:

public Form1()

{

InitializeComponent();

Thread thread = new Thread(new ThreadStart(RegisterIdleEvent));

thread.Start();

}

private static void RegisterIdleEvent()

{

Application.Idle +=new EventHandler(Application_Idle);

}

4. 运行该程序,我们发现没有消息框跳出来提示Application is idle

三、原因分析

Application.Idle在程序的UI线程的消息队列里所有消息已经响应完时被触发,此时其UI线程处于空闲状态。而我们新创建的任务线程没有消息队列,因此Application.Idle事件对这样的线程没有意义,那么它的处理器自然就不会被调用到了。

四、解决方案

我们只能在UI线程里注册Application.Idle事件。

你可能感兴趣的:(thread,UI)