在很多操作中,都会使用到异步线程,具体怎样使用在这不说了,网上有很好的说明;本人通过Delegate.BeginInvoke实现异步调用,完成后对UI控件进行设值等,还有System.Timers.Timer都一样,使用的是线程池的线程。
在异步线程的执行方法中,如果直接使用Control.Invoke转到当前的工作线程,然后设置UI控件的值,完成后继续执行异步线程未完成的代码,不知道是异步线程没有被及时回收,还是别的原因,UI的句柄(可能是一个指针引用),在任务管理器中不断增加。应该是没有回收完成的异步线程的原因。如果使用Timer的Elapsed事件,好像是没有减少的,可能是Timer为全局性的吧,不去考究了。如果是使用new MethodInvoker().BeginInvoke的调用,过一段时间,句柄会减少(回收了)。
具体的解决办法:使用Control.BeginInvoke方法(如果需要同步控件及返回值的不能用些方法),Control.BeginInvoke的线程和上异步线程成了并行执行。是没有任何关系的两个线程了,测试表明,句柄没有增加,至于内存增加,是回收机制还没有执行所致(Event引起的内存泄露不能算,要处理),