System.Timers.Timer在c#中挂起Windows窗体应用程序

时间:2013-08-09 12:12:15

标签: c# winforms timer

下面的代码显示了一个计时器,每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
              }

2 个答案:

答案 0 :(得分:5)

    register_Timer.SynchronizingObject = this; 

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

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

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

答案 1 :(得分:1)

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

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