一、现象描述
如果我们在一个非UI线程里为事件(Event)Application.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事件。
相关资源:微信小程序源码-合集1.rar