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

问题描述 投票:0回答:3

下面的代码显示了一个计时器,每 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
              }
c# winforms timer
3个回答
6
投票
    register_Timer.SynchronizingObject = this; 

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

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

不要这样做,而是使用 System.Windows.Forms.Timer。它的工作原理与您的计时器完全相同,但消除了所有缺点。


1
投票

应用程序挂起是因为您正在执行弹出窗口(我假设是

MessageBox
或其他一些模式对话框)。当然,应用程序将会挂起。您正在 UI 线程中放置一个模式对话框。

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


0
投票
using Timer = System.Windows.Forms.Timer;

将其设置在使用之上。

然后下课

设置

       Timer timer;
       DateTime startTime;

然后打电话

      startTime = DateTime.Now;
      timer.Start();

启动计时器

© www.soinside.com 2019 - 2024. All rights reserved.