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

当尝试在非UI线程中为Winforms的Application.Idle事件注册处理器时,事件处理器将不会被调用。问题在于Application.Idle事件仅在UI线程的消息队列为空时触发,而新创建的任务线程没有消息队列,导致事件无效。解决办法是在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事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值