0

下面的代码显示了一个计时器,它每 100 * 1000(毫秒)滴答一次,以显示注册的弹出消息。下面的代码正在运行,但不幸的是我的应用程序在一段时间后挂起。

我已经在 google 和 stackoverflow 中搜索了这个答案。但我找不到正确的答案来让我的应用程序正常工作而不会被绞死。

        private System.Timers.Timer register_Timer = new System.Timers.Timer();

        register_Timer.Interval = (100 * 1000);
        register_Timer.Elapsed += new ElapsedEventHandler(register_Timer_Tick);     
        register_Timer.SynchronizingObject = this;            
        register_Timer.AutoReset = true;       
        register_Timer.Enabled = true;

        System.GC.KeepAlive(register_Timer);

        private void register_Timer_Tick(object sender, EventArgs e)
              {
                //Pop up to show register message
              }
4

2 回答 2

6
    register_Timer.SynchronizingObject = this; 

这完全违背了使用 System.Timers.Timer 的原因。它防止 Elapsed 事件处理程序在线程池线程上引发,该属性确保它将在 UI 线程上运行。这就是你想要的。

但是你仍然会得到 Timer 类的所有缺点。特别是它在没有诊断的情况下吞咽异常的习惯非常难看。除了在表单关闭后继续引发 Elapsed 事件,确保这不会发生是一个非常难以解决的问题,还有两个固有的竞争条件。.NET 1.0 有一些与线程相关的设计错误,这就是其中之一。

只是不要这样做,而是使用 System.Windows.Forms.Timer 。它会像你的计时器一样工作,减去所有的缺点。

于 2013-08-09T12:29:00.240 回答
1

应用程序挂起是因为您正在弹出一个窗口(我假设是一个MessageBox或其他模式对话框)。当然,应用程序会挂起。您正在 UI 线程中放置一个模式对话框。

问题不在于计时器,而在于您的应用程序设计。

于 2013-08-09T14:12:14.970 回答