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

Mot*_*thy 0 c# timer winforms

下面的代码显示了一个计时器,每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
              }
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

    register_Timer.SynchronizingObject = this; 
Run Code Online (Sandbox Code Playgroud)

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

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

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