2012-03-30 18 views
2

私の会社で強化するWindowsサービスを継承しました。現在、指定された開始時刻にデータベース内の特定のレコードのレポートを毎日印刷します。特定のレコードを省略して同じレポートを実行するために、2番目の開始時刻を設定する条件を追加しています。私が実行している問題は、2つの別々の開始時間(通常約15分間隔)を設定し、最初の開始時間をスキップして、レポートファイルがすでに存在する場合は2番目の開始時間を実行するように見えるということです。Windowsサービス上の複数のタイマーが正しく起動しない

public partial class Service1 : ServiceBase 
{ 
    Timer t1; 
    Timer t2; 
    bool Condition; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 
    protected override void OnStart(string[] args) 
    { 
     t1 = new Timer(); 
     t1.Interval = (1000 * 60 * 3); // 3 minutes... 
     t1.Elapsed += new ElapsedEventHandler(t1_Elapsed); 
     t1.AutoReset = true; 
     t1.Enabled = true; 

     if (Condition) //Condition is an option in the configuration to determine if this timer should even start 
     { 
      t2 = new Timer(); 
      t2.Interval = (1000 * 60 * 3); // 3 minutes... 
      t2.Elapsed += new ElapsedEventHandler(t2_Elapsed); 
      t2.AutoReset = true; 
      t2.Enabled = true; 
     } 
    } 
    private void t1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     if (File.Exists("FileName1")) 
     { 
      string CurrentTime = DateTime.Now.ToShortDateString(); 

      if (CurrentTime == ConfigurationManager.AppSettings["StartTime"].ToString()) 
      { 
       //Print Report 
      } 
     } 
     else 
     { 
      //Print Report 
     } 
    } 
    private void t2_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     if (File.Exists("FileName2")) 
     { 
      string CurrentTime2 = DateTime.Now.ToShortDateString(); 

      if (CurrentTime2 == ConfigurationManager.AppSettings["StartTime2"].ToString()) 
      { 
       //Print Report 2 
      } 
     } 
     else 
     { 
      //Print Report 2 
     } 
    }   
    protected override void OnStop() 
    { 
     t1.Enabled = false; 
     t2.Enabled = false; 
    } 
} 

なぜこの最初のものがスキップされているのかわかりません。どちらもファイルが存在するかどうかをチェックし、存在しない場合は印刷します。次回の実行時には、2番目のレポートがスケジュールされた時間に印刷されますが、最初のレポートはスキップされます。私は何が欠けているのかわからない。

+0

なぜこれに2つのタイマを使用していますか?タスクを別々のメソッドに分割し、単一のタイマー経過イベントからメソッドを呼び出し、タイマー経過イベントで条件をチェックします。 – JamieSee

+0

サイドノート、このために[スケジュールされたタスク](http://stackoverflow.com/questions/7394806/creating-scheduled-tasks)を使用する必要があります。サービス+タイマー=デザインの匂い。これを行うことで、あなたが抱えている問題のほとんどを避けることができます。また、あなたが時間を比較している方法は、非常に不愉快に思えます。あなたの問題はそこにあるかもしれません。 StartTimeとStartTime2が実際にあなたの設定ファイルに入っているのを見ることなく、わかりにくいです。 – Will

+0

私はもともとそれを1つのタイマーで2つの別々のメソッドとして持っていましたが、残念ながらそれが何であったかを覚えていないという別の問題がありました。私は以来、これにいくつかの変更を加えました。 – LDWisdom

答えて

2

間違ったタイマーを使用している可能性はありますか?

System.Timers.Timer 

System.Thread.Timer 

System.Windows.Forms.Timer 

私はそれがスレッドsafetiness経由を提供してWindowsサービスで、あなたが最初の2、より多くの可能性が高いでSystem.Timers.Timerのいずれかを使用する必要があります信じている:私は.NETのタイマーの約2または3種類があった覚え SynchronizationObjectプロパティ: System.Timers.Timer vs System.Threading.Timer

関連する問題