【问题标题】:System.Timers.Timer hangs the Windows Forms application in c#System.Timers.Timer 在 c# 中挂起 Windows 窗体应用程序
【发布时间】:2013-08-09 12:12:14
【问题描述】:

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

【问题讨论】:

  • 1) GC.KeepAlive 没有为您做任何事情 stackoverflow.com/q/18136735/56778。 2)真的没有必要为区间做数学。 TimeSpan.FromSeconds(100).TotalMilliseconds 更清楚。当你只做 100 秒时没什么大不了的,但如果你想要 27 分钟或 3 小时 12 分钟,使用TimeSpan 会更清楚。
  • 我认为您的应用程序因其他原因而挂起。这段代码对我来说可以。我认为它非常像System.Windows.Forms.Timer。除非您在其他地方有可能导致此问题的代码。
  • 你展示了什么样的弹出窗口?
  • @KingKing:如果我不使用计时器,应用程序不会被挂起。
  • @JimMischel :我在 timertick 函数中使用了一个消息框。

标签: c# winforms timer


【解决方案1】:
    register_Timer.SynchronizingObject = this; 

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

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

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

【讨论】:

  • 感谢您的回复。但我之前也尝试过使用“System.Windows.Forms.Timer”..仍然应用程序被挂起。 :(
  • 使用 System.Timers.Timer 无法修复代码中的原始问题。问那个问题绝对更聪明。至少每个人都可以针对困扰您的程序的任何问题解决线程问题。单击按钮并确保发布重现挂起的 sn-p,这次使用同步计时器。
【解决方案2】:

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

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

【讨论】:

  • 是的,我正在使用消息框。你能告诉我如何使应用程序在不挂起的情况下工作吗??
  • @Mothy:要解决此问题,您必须使用其他方式进行通知。您需要一个非模态对话框,或将信息写入文本框或主窗体上的类似内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多