如何处理LargeIntervalTimer
我正在使用OpenNetCF的LargeIntervalTimer在特定条件下在特定屏幕上进行轮询。
由于我不希望定时器不停地触发,所以一旦不再需要它就会尝试处理它,但是在UI线程中调用Dispose()或将Enabled设置为false通常会挂起应用程序。
我已经尝试将计时器处理代码移动到计时器的线程上(通过在tick方法中调用它),这只是使挂起更加一致,(虽然在一个单独的线程中,所以应用程序的其余部分继续工作)。
有没有人看到这个计时器的类似问题,如果是这样,你是如何解决它们的?
启动代码:
_timer = new LargeIntervalTimer();
_timer.OneShot = false;
_timer.Tick += TimerTick;
_timer.Interval = new TimeSpan(0, 0, 30);
_timer.FirstEventTime = DateTime.Now.AddSeconds(30);
_timer.Enabled = true;
关机代码:
if (_timer != null)
{
_timer.Enabled = false;
_timer.Dispose();
_timer = null;
}
没有找到相关结果
已邀请:
1 个回复
倪蕊悲潍
如您所见,它将Enabled设置为
,然后设置
。 Enabled实现同样简单:
基本上如果我们禁用并且我们被启用,则Dispose将设置的相同WaitHandle正在设置。冗余,是的,但不是问题。 SetEvent不是一个时钟调用,所以这个代码就是你调用的直接结果,应该是影响“挂起”场景的唯一因素。但为了完整起见,让我们来看看这个事件是在触发什么。这是工作线程proc(主要是LIT类的主要内容):
大约一半你会看到一个
电话,这是该事件被捕获的地方。当调用来自上面的snipptes的事件时,它只返回
,它将我们放到
,它将m_enabled设置为false,然后退出while循环并运行finally块。 finally块重置了waithandle,所有线程都退出了,你就完成了。再次,非常简单,我认为没有悬挂的潜力。 此时我可以推荐的是将
调用放入LIT源,以查看用例中发生的情况。它可能会更清楚地说明您的环境中发生的事情会导致不良行为。 请记住,处置LIT仍然可能会在您的操作系统通知队列中保留一个活动通知,因此注册的事件仍将再次触发。这仍然应该没有影响,因为我们不再听它,所以它只是在没有听众的情况下解雇,这不是问题。