저는 회사에서 향상시킬 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;
}
}
이 첫 번째 이유가 무엇인지 알 수 없습니다. 둘 다 파일이 있는지 확인하고 그렇지 않은 경우 인쇄합니다. 다음에 실행될 때 두 번째 보고서는 예정된 시간에 인쇄되지만 첫 번째 보고서는 건너 뜁니다. 내가 잃어버린 것을 알아낼 수 없다.
왜이 용도로 두 개의 타이머를 사용하고 있습니까? 작업을 별도의 메서드로 분리하고 단일 타이머 경과 이벤트에서 메서드를 호출하고 타이머 경과 이벤트에서 조건을 확인합니다. – JamieSee
사이드 노트, 이것을 위해 [예약 된 작업] (http://stackoverflow.com/questions/7394806/creating-scheduled-tasks)을 사용해야합니다. 서비스 + 타이머 = 디자인 냄새. 이렇게하면 문제의 대부분을 피할 수 있습니다. 또한 시간을 비교하는 방식이 매우 불쾌한 것처럼 보입니다. 거기에 문제가있을 수 있습니다. StartTime과 StartTime2가 실제로 설정 파일에있는 것처럼 보이지 않으면 알기가 어렵습니다. – Will
원래 하나의 타이머에는 두 개의 분리 된 메소드가 있었지만 불행하게도 그게 무엇인지 기억할 수없는 일종의 다른 문제가있었습니다. 나는이 이후 몇 가지 다른 변경 사항을 만들었으므로 변경하면 다시 작동 할 수 있습니다. – LDWisdom