2011-09-22 60 views
4

我在Windows服务中使用System.threading.timer。 但定时器没有成功执行。下面是代码。System.threading.timer在Windows服务中不起作用

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

    } 

后全成安装。我的工作站restarted.On重新启动机器,该服务被称为successfully.But一旦该服务被称为第一次,不重复进行下一时间段即服务不叫再次。

回答

13

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

只要你使用的是定时器,你必须保持一个参考吧。由于 与任何托管对象有关,因此当 中没有对它的引用时,Timer将进行垃圾回收。定时器仍处于活动状态的事实 并不妨碍它被收集。

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

我认为您在OnStart中创建的计时器对象是gc收集或处置的。它不应该是该方法中的局部变量,因为它超出了范围。

+0

之前我来搜索这个我是另外一件事情,但仍然没有答案,我也持有在类作为领域的参考。那就是说,计时器的实现应该在后台运行。后台线程会在主线程完成后终止,...(我并不完全确定服务中的这个问题,但这就是我想的) – deadManN

相关问题