2012-04-03 14 views
2

10分間隔でクラスライブラリを呼び出すためのWindowsサービスを作成しました。開始または再起動時に正常に動作します。それはまったく起こっていません。何が欠けているか分かりませんが、正しい方法を特定してください。インターバル時間に基づいてWindowsサービスが開始されない

はここので、あなたのコードは、1日1回実行されます

public partial class Service1 : ServiceBase 
{ 
    private Timer _timer; 
    private DateTime _lastRun = DateTime.Now; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     _timer = new Timer(10 * 60 * 1000); // every 10 minutes 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
     Shell Distribute= new Shell(); 
     Distribute.Distribute(); 
    } 

    protected override void OnStop() 
    { 
     this.ExitCode = 0; 
     base.OnStop(); 

    } 
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //if (_lastRun.Date < DateTime.Now.Date) 
     //{ 
      _timer.Stop(); 
      _lastRun = DateTime.Now; 
      _timer.Start(); 
     //} 
     } 

    } 
} 
+1

日付の比較が最も原因です。ただし、Timerクラスは、Elapsedイベントを発生させると例外をスワイします。 try/catchを使用してコード内のエラーを診断する必要があります。それをスキップしないでください。例外があれば、例外は非常に診断不能です。 –

+0

@ HansPassant、私もコメントしました。条件文がまだ10分間隔でサービスを実行していない場合 – Usher

答えて

0

を確認してくださいOkieは、最終的に私は、なぜそのが働いていない答え、このコードはうまくタイマー間隔に基づいた作品

(私のミスを指摘し、他のフォーラムからの専門家の一つ)を得ました。

 public partial class Service1 : ServiceBase 
{ 
    private Timer _timer; 
    private DateTime _lastRun = DateTime.Now; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     _timer = new Timer(10 * 60 * 1000); // every 10 minutes 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
     Shell Distribute= new Shell(); 
     Distribute.Distribute(); 
_timer.start();//this line was missed in my original code 
    } 

    protected override void OnStop() 
    { 
     this.ExitCode = 0; 
     base.OnStop(); 

    } 
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //if (_lastRun.Date < DateTime.Now.Date) 
     //{ 

try 
{ 
_timer.Stop(); 
Shell Distribute= new Shell(); 
Distribute.Distribute(); 
} 
catch(exception ex) 
{} 
finally 
{ 

      _timer.Start(); 
} 
     //} 
     } 

    } 
} 
+0

意味があります。私はあなたの質問を正しく見ていないので、私はそれを見ています。サービス開始イベントでジョブを開始しますが、タイマーを有効にしないでください。私は新しい眼鏡が必要だと思う。あなたが主なヒントである起動または再起動時にうまく動作すると言っていました。タイマーイベント中に何かが間違っているかどうかを確認できるように、キャッチブロックにいくつかのログを追加します。エラーを引き起こすサービスより悪いことはありません。 – Namphibian

+0

私はNamphibianに同意します。サービス開始時に何が起きているのかを見つけるためにログを追加します。 – Usher

3

あなたの問題は、日付if (_lastRun.Date < DateTime.Now.Date)で比較されて私のコードです。

+0

私は完全に自分のコードを変更し、それらの部分をまだ時間間隔に基づいて実行していないとコメントしました。 – Usher

2

私はOzgurに同意します。あなたのロジックは間違っているようです。あなただけのtimer_Elapsedイベント中にタイマーを停止することができますロジックと再起動タイマー

ような何か:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 

    try{ 
     // stop the timer while we are running the cleanup task 

     _timer.Stop(); 
     // 
     // do cleanup stuff 
     // 
    }catch (Exception e){ 
     //do your error handling here. 
    } 
    finally{ 

     _timer.Start(); 
    } 

    } 
} 

ジャストトライキャッチでそれをラップし、最終的にあなたが例外を処理して、タイマーがあることを確認することができますがもう一度始めた。また、このリンクBest Timer for using in a Windows service

+0

、私はあなたの方法を試して、それでも動作しません – Usher

+0

私はここに提案をすることはできますか?なぜサービスに何らかの形式のログを記録しないでください。次に、デバッグメッセージをログに書き込みます。私は通常、次のようなデバッグ情報を持つシンプルなテキストファイルを使用します。これは、問題の追跡に役立ちます。また、例外を記録するようにしてください。 – Namphibian

関連する問題