2011-01-07 3 views
2

다른 Windows 서비스를 만들고 타이머가 똑딱 거리지 않아서 그 이유를 알 수 없습니다! 이전 서비스에서 사용하던 system.timers.timer를 사용하고 있는데 작동하지 않습니다. 나는 그것에 붙이려고했지만 아무 것도하지 않는 것 같습니다.System.Timers.Timer timer1_Elapsed가 실행되지 않습니다! 도움!

내 코드 :

namespace ExpiryNotifier 
{ 
    public partial class ExpiryNotifier : ServiceBase 
    { 
     public ExpiryNotifier() 
     { 
      InitializeComponent(); 
      if (!System.Diagnostics.EventLog.SourceExists("ExpiryNotifier")) 
      { 
       System.Diagnostics.EventLog.CreateEventSource("ExpiryNotifier", "ExpiryNotifier"); 
      } 
      eventLog1.Source = "ExpiryNotifier"; 
      eventLog1.Log = "ExpiryNotifier"; 
     } 
     private Timer timer1 = new Timer(); 
     protected override void OnStart(string[] args) 
     { 
      eventLog1.WriteEntry("Service Started"); 
      timer1.Elapsed += timer1_Elapsed; 
      timer1.Interval = 10000; 
      timer1.Enabled = true; 

     } 

     protected override void OnStop() 
     { 
      eventLog1.WriteEntry("Service Stopped"); 
      timer1.Enabled = false; 

     } 

     private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      eventLog1.WriteEntry("timer tick"); 
      timer1.Stop(); 

      EmailerService.EmailerService service = new EmailerService.EmailerService(); 
      DataSet expiringQualifications = service.GetDetailsOfExpiringQualifications(); 

      if(expiringQualifications.Tables[0].Rows.Count>0) 
      { 
       foreach(DataRow rw in expiringQualifications.Tables[0].Rows) 
       { 
        if (!string.IsNullOrEmpty(rw["EmailAddress"].ToString())) 
        { 
         if (rw["QualAwardDescription"] != null) 
         { 
          service.SendQualExpiryEmail(rw["EmailAddress"].ToString(), rw["firstName"].ToString(), 
                 rw["QualAwardDescription"].ToString()); 
         } 
        } 
       } 
      } 


      timer1.Start(); 
     } 
    } 
} 

사람이 문제를 볼 수 있을까요?

미리 감사드립니다.

벡스

+1

"서비스 시작"항목을 볼 수 있습니까? –

답변

7

System.Timers.Timer 못생긴 타이머입니다. Elapsed 이벤트 핸들러에서 발생한 예외를 삼키는 것입니다. 방법을 입력 할 때 타이머를 중지하기 때문에 타이머가 종료됩니다. 아무 통지도, 그것은 다만 작동 중지하지 않는다.

예외를 기록하고 서비스를 중지하려면 최소한이 코드에 예외 처리를 추가해야합니다.

OnStart() 메서드의 버그에주의하십시오. 서비스를 시작할 때마다 계속 이벤트 핸들러를 추가 할 것입니다. Elapsed 이벤트는 여러 번 실행되므로 그 자체로 폭탄을 터뜨리는 좋은 방법입니다.

System.Threading.Timer를 고려해보십시오. 이러한 문제는 없습니다.

+0

나를 버그에 경고 해 주셔서 감사합니다.초기화로 이동했는데 이제 서비스가 실제로 작동하기 시작했습니다. 초기화시 괜찮습니까? – Bex

+0

작동하면 괜찮습니다. OnStart/Stop에서 Enabled 만 변경하십시오. 그리고 예외 처리를 추가하십시오. –

0

System.Timers.Timer.Start는() = TRUE System.Timers.Timer.Enabled와 동일한 기능을 갖고; System.Timers.Timer.Stop()에는 System.Timers.Timer.Enabled = false와 같은 기능이 있습니다.

이 두 메서드는 내부적으로 Enabled 속성을 true 또는 false로 설정하여 타이머를 시작하거나 중지합니다.

이벤트 로그에 쓸 수있는 권한이 있는지 확인하십시오. 이벤트 로그에서 오류를 확인할 수도 있습니다.

System.Timers.Timer는 스레드로부터 안전하지 않습니다. 올바르게 사용하는지 확인하십시오.

0

는 정말 제대로 내부 예외를 던질 것 같이 내가 서비스 내에서의이 System.Threading.Timer을 추천하지만

timer1_Elapsed += new ElapsedEventHandler(timer1_Elapsed); 

http://msdn.microsoft.com/es-es/library/system.timers.timer.aspx

, timer1_Elapsed 필요가 이벤트 대리자를 사용하는 생각 경과 된 이벤트. System.Timers.Timer 그냥 그들을 삼키는.

http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

0

작동하는 것처럼 보이지만 디버깅하는 데 더 좋은 방법 일 것입니다. 누가 당신의 eventLog1 당신이 첨부 할 것인지 묻는 대화 상자를 얻을 수 있습니다 서비스에서 시작 쳤을 때 널 (null)

업데이트가 ONSTART 지금이

protected override void OnStart(string[] args) 
    { 
     foreach (string arg in args) 
     { 
      if (arg == "DEBUG_SERVICE") 
        DebugMode(); 

     } 

    #if DEBUG 
     DebugMode(); 
    #endif 

    eventLog1.WriteEntry("Service Started"); 
    timer1.Elapsed += timer1_Elapsed; 
    timer1.Interval = 10000; 
    timer1.Enabled = true; 

    } 

private static void DebugMode() 
{ 

    Debugger.Break(); 
} 

을 포함하는 것입니다 아마 알고있다. 그 방법은 쉽게 다음 수동으로 첨부하려고합니다.

+0

나는 그 서비스를 진드기로 처리 할 수 ​​있었지만 그것을 디버그 할 수는 없다. 첨부 할 때 이벤트 로그에 쓰는 중임을 알 수 있으므로 중단 점이 발생하지 않습니다. 따라서 debug.break를 추가하면 서비스가 중단됩니다! – Bex

+0

신경 쓰지 마라. 정식 버전이 아닌 .net 4 클라이언트 프로파일을 참조하고 있었는데, 이것이 디버깅 할 수없는 것 같습니다. – Bex

관련 문제