2012-03-30 6 views
2

저는 회사에서 향상시킬 Windows 서비스를 상속 받았습니다. 현재이 서비스는 지정된 시작 시간에 데이터베이스의 특정 레코드에 대한 보고서를 매일 인쇄합니다. 특정 레코드를 생략 한 동일한 보고서를 실행하는 두 번째 시작 시간을 설정하는 조건을 추가하고 있습니다. 내가 겪고있는 문제는 두 개의 별도 시작 시간 (일반적으로 약 15 분 간격)을 설정하고 보고서 파일이 이미있는 경우 첫 번째 시작 시간을 건너 뛰고 두 번째 실행 시간 만 건너 뛰는 것처럼 보입니다.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; 
    } 
} 

이 첫 번째 이유가 무엇인지 알 수 없습니다. 둘 다 파일이 있는지 확인하고 그렇지 않은 경우 인쇄합니다. 다음에 실행될 때 두 번째 보고서는 예정된 시간에 인쇄되지만 첫 번째 보고서는 건너 뜁니다. 내가 잃어버린 것을 알아낼 수 없다.

+0

왜이 용도로 두 개의 타이머를 사용하고 있습니까? 작업을 별도의 메서드로 분리하고 단일 타이머 경과 이벤트에서 메서드를 호출하고 타이머 경과 이벤트에서 조건을 확인합니다. – JamieSee

+0

사이드 노트, 이것을 위해 [예약 된 작업] (http://stackoverflow.com/questions/7394806/creating-scheduled-tasks)을 사용해야합니다. 서비스 + 타이머 = 디자인 냄새. 이렇게하면 문제의 대부분을 피할 수 있습니다. 또한 시간을 비교하는 방식이 매우 불쾌한 것처럼 보입니다. 거기에 문제가있을 수 있습니다. StartTime과 StartTime2가 실제로 설정 파일에있는 것처럼 보이지 않으면 알기가 어렵습니다. – Will

+0

원래 하나의 타이머에는 두 개의 분리 된 메소드가 있었지만 불행하게도 그게 무엇인지 기억할 수없는 일종의 다른 문제가있었습니다. 나는이 이후 몇 가지 다른 변경 사항을 만들었으므로 변경하면 다시 작동 할 수 있습니다. – LDWisdom

답변

2

잘못된 타이머를 사용할 가능성이 있습니까? 나는 타이머 약 2 ~ 3 종류의 닷넷에 있었다 기억

System.Timers.Timer 

System.Thread.Timer 

System.Windows.Forms.Timer 

나는 그것을 통해 스레드 safetiness를 제공하기 때문에 처음 두 중 하나 가능성 System.Timers.Timer를 사용해야 Windows 서비스를 믿는 SynchronizationObject 속성 : System.Timers.Timer vs System.Threading.Timer

관련 문제