【问题标题】:Why does System.Threading.Timer stop on its own?为什么 System.Threading.Timer 会自行停止?
【发布时间】:2010-02-04 01:43:09
【问题描述】:

在 Windows 服务项目中使用 System.Threading.Timer 之前,我正在做一个小型测试项目。它工作得很好,但是计时器会在一两分钟后自行停止。

测试项目的完整来源是:

using System;
using System.Windows.Forms;
using System.Threading;

namespace studyTimers {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            TimerCallback timerDelegate = new TimerCallback(tick);
            System.Threading.Timer testTimer = new System.Threading.Timer(timerDelegate, null, 1000, 1000);
        }

        void tick(Object obj) {
            if (label1.InvokeRequired) {
                label1.Invoke(new MethodInvoker(() => tick(obj)));
            } else {
                label1.Text = DateTime.Now.ToString();
            }
        }
    }
}

目标显然是用当前时间更新标签。我注意到更新会在一段时间后停止。为什么会这样?

【问题讨论】:

  • @Michael Burr :你为什么覆盖我的编辑,让代码再次隐藏?

标签: c# .net service timer


【解决方案1】:

如果您需要在 Windows 窗体上设置计时器,请将 System.Windows.Forms.Timer 拖放到窗体上 - 没有理由使用 System.Threading.Timer,除非您需要比 55 毫秒更好的分辨率。

计时器“停止”的原因是因为它正在被垃圾收集。您允许它超出 Form1_Load 方法的范围,因为您只将其声明为局部变量。为了保持计时器“活动”,它需要是表单类上的私有字段,以便 GC 知道它仍然需要。

换句话说:

public partial class Form1 : Form
{
    private System.Threading.Timer testTimer;

    ...

    public void Form1_Load(object sender, EventArgs e)
    {
        TimerCallback timerDelegate = new TimerCallback(tick);
        testTimer = new System.Threading.Timer(timerDelegate, null, 1000, 1000);
    }
}

但同样,在这种情况下,使用 System.Windows.Forms.Timer 会更简单,它是工具箱中的一个实际组件,您可以直接放到表单上。


编辑 - 正如 cmets 现在所揭示的,如果这只是一个测试应用程序并且真正的应用程序位于 Windows 服务中,那么您不能为此使用 System.Windows.Forms.Timer .请记住不要让您的System.Threading.Timer 超出范围。

【讨论】:

  • 这实际上是服务中的计时器正在使用的,它没有触发。这只是一个小测试项目。
【解决方案2】:

垃圾收集器收集了计时器对象,你应该保留对它的引用。 这篇文章会有所帮助:http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

【讨论】:

  • 已有包含此信息的答案。重复它,但细节要少得多。
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多