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

C# System.Timers.Timer挂起c中的Windows窗体应用程序,c#,winforms,timer,C#,Winforms,Timer,下面的代码显示了一个计时器,它每100*1000毫秒滴答一次,以显示注册的弹出消息。下面的代码正在工作,但不幸的是,我的应用程序在一段时间后挂起 我已经在谷歌和stackoverflow上搜索过这个答案,但是我找不到一个正确的答案来让我的应用程序正常工作,而不会被绞死 private System.Timers.Timer register_Timer = new System.Timers.Timer(); register_Timer.Interval =

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

我已经在谷歌和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
              }
这完全违背了使用System.Timers.Timer的理由。它防止在线程池线程上引发已用事件处理程序,该属性确保它将在UI线程上运行。这正是你想要的

但是你仍然会发现计时器类的所有缺点。尤其是它在没有诊断的情况下吞咽异常的习惯非常难看。除了在窗体关闭后继续引发已过去的事件外,确保这不会发生也是一个很难解决的问题,存在两个固有的争用条件。NET1.0有一些与线程相关的设计错误,这就是其中之一


不要这样做,而是使用System.Windows.Forms.Timer。它的工作原理与计时器完全相同,没有任何缺点。

应用程序挂起,因为您正在弹出一个消息框或其他模式对话框。当然,应用程序将挂起。您正在UI线程中放置一个模式对话框


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

谢谢您的回复。但我之前也尝试过使用System.Windows.Forms.timer。但应用程序仍然挂起:使用System.Timers.Timer无法修复代码中的原始问题。相反,问这个问题肯定更聪明。至少每个人都可以解决程序中出现的任何问题的线程问题。单击“提问”按钮,并确保发布一个复制挂起的代码段,这次使用的是同步计时器。1 GC.KeepAlive没有为您做任何事情。这段时间真的不需要做数学题。TimeSpan.FromSeconds100.Total毫秒更清晰。如果你只需要做100秒,这没什么大不了的,但是如果你想要27分钟或3小时12分钟,那么使用TimeSpan就更清楚了。我认为你的应用程序被挂起还有另一个原因。这个代码对我来说没问题。我认为它非常像System.Windows.Forms.Timer。除非您在其他地方有可能导致此问题的代码。您显示的是什么样的弹出窗口?@KingKing:如果我不使用计时器,应用程序不会被挂起。@JimMischel:我在timertick函数中使用一个messagebox。是的,我正在使用messagebox。你能告诉我如何让应用程序在不挂起的情况下工作吗???@Mothy:要解决这个问题,你必须使用其他方法来发送通知。您需要一个非模态对话框,或者将信息写入文本框或主窗体上的类似内容。
    register_Timer.SynchronizingObject = this;