System.threading.timer无法在Windows服务中运行

sac*_*rni 4 c# multithreading windows-services timer

我在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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

安装成功后.我的工作站重新启动.重启机器后,服务成功调用.但是一旦第一次调用该服务,它就不会重复下一次持续时间,即不再调用该服务.

Dav*_*ras 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中创建的计时器对象是gc收集或处理的.它不应该是该方法中的局部变量,因为它超出了范围.