System.Threading.Timer在Windows服务中无法工作

4

我正在Windows服务中使用System.Threading.Timer,但计时器未能成功执行。以下是代码。

    protected override void OnStart(string[] args)
    {
        try
        {  
        eventLog1.WriteEntry("In OnStart");
        TimeSpan dueMinutes = TimeSpan.FromMinutes(1);
        TimeSpan fromMinutes = TimeSpan.FromMinutes(1);
        System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(CallBack), null, dueMinutes, fromMinutes);


            /*
        System.Timers.Timer timer = new System.Timers.Timer(5 * 60 * 1000);       
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);               
            DBSyncHandler sync = new DBSyncHandler();
            sync.startSync();                 
        */
        }
        catch (Exception ex)
        {
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyEventLog";
            eventLog1.WriteEntry("Error : " + ex.Message);
        }

    }



    public static void CallBack(object sender)
    {

        try
        {
            DBSyncHandler sync = new DBSyncHandler();
            sync.startSync();
        }
        catch (Exception ex)
        {
            EventLog eventLog1 = new EventLog();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MySource", "MyEventLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyEventLog";
            eventLog1.WriteEntry("Error : " + ex.Message);
        }

    }

安装成功后,我的工作站重新启动。重新启动机器后,服务被成功调用。但是一旦服务第一次被调用,它就不会在接下来的时间段内重复调用,也就是说,服务不会再次被调用。

2个回答

13

阅读 MSDN 上的注释:http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

只要使用 Timer,您必须保留对它的引用。与任何托管对象一样,当没有对其的引用时,Timer 就会受到垃圾回收机制的影响。即使一个 Timer 仍然处于活动状态,也不能防止它被收集。

System.Threading.Timer 是一个简单、轻量级的定时器,它使用回调方法并由线程池线程提供服务。它不适合与 Windows 窗体一起使用,因为它的回调不会在用户界面线程上发生。System.Windows.Forms.Timer 更适合与 Windows 窗体一起使用。对于基于服务器的定时器功能,您可以考虑使用 System.Timers.Timer,它会引发事件并具有其他功能。

我认为您在 OnStart 中创建的计时器对象可能已被垃圾回收或丢弃。它不应该是该方法中的局部变量,因为它超出了作用域。


在我搜索这个问题之前,我还担心另一件事情,但仍然没有答案。我也将引用作为类字段。此外,定时器的实现方式应该是在后台运行,并且后台线程在主线程完成后终止...(我对服务中的这个问题不是很确定,但我认为是这样)。 - Hassan Faghihi

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接