2011-01-07 15 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(); 
     } 
    } 
} 

誰もが問題を見ることができますか?

ありがとうございます!

Bexの

+1

「サービス開始」エントリが表示されますか? –

答えて

7

でSystem.Timers.Timerは醜いタイマーです。 Elapsedイベントハンドラによって発生した例外を取り除くことが1つの厄介なことです。メソッドを入力するときにタイマーを停止するので、タイマーは強制終了します。何の通知もなく、ただ仕事を止めるだけです。

例外をログに記録してサービスを停止するには、少なくともこのコードに例外処理を追加する必要があります。

また、OnStart()メソッドのバグに注意してください。サービスが開始されるたびにイベントハンドラを追加し続けます。 Elapsedイベントは複数回実行され、それ自体が何かを爆撃するのに適しています。

System.Threading.Timerを検討してください。これらの問題はありません。

+0

バグに私に警告してくれてありがとう。私はそれを初期化に移しました、そして、サービスは実際に働き始めました。それは初期化で大丈夫でしょうか? – Bex

+0

それがうまくいくならそれは大丈夫です。 OnStart/StopでEnabledを変更するだけです。そして、例外処理を追加します。 –

0

System.Timers.Timer.Startは()System.Timers.Timer.Enabled = TRUEと同様の機能を有します。 System.Timers.Timer.Stop()には、System.Timers.Timer.Enabled = falseと同じ機能があります。

これらの2つのメソッドは、Enabledプロパティをtrueまたはfalseに設定して、タイマーを開始または停止します。

イベントログへの書き込み権限があるかどうかを確認してください。イベントログのエラーをチェックすることもできます。

System.Timers.Timerはスレッドセーフではありません。正しく使用することを確認してください。

0

それが正しく内部例外がスローされますように私は、サービス内部のためのSystem.Threading.Timerをお勧めしますが、私はイベントデリゲートを使用するtimer1_Elapsedニーズを考えて、そう

timer1_Elapsed += new ElapsedEventHandler(timer1_Elapsed); 

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

経過イベント。 System.Timers.Timerはそれらを呑み込むだけです。

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

0

それはうまくいくようですが、おそらくそれをデバッグするためのより良い方法です。誰があなたのeventLog1はあなたがアタッチするかどうかを確認するダイアログを取得しますサービスを開始打ったときはnull

Updateはあなたの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

関連する問題