2010-02-16 5 views
4

데이터베이스 가져 오기를 수행하는 Windows 서비스를 구현해야하며 한 달에 한 번 처리해야합니다. 프로그램은 전자 메일을 통해 데이터를 수신하고 매월 말에 데이터를 가져옵니다.해상도가 매우 낮은 타이머를 만드는 방법은 무엇입니까?

프로그램을 max_integer seconds/miliseconds 동안 반복적으로 sleep로 설정하는 것보다 나은 방법이 있습니까?

+1

한 달에 한 번 일어날 서비스를 만드는 것이 좋습니까? 프로그램을 만들고 매월 실행하도록 예약하는 것이 더 좋지 않습니까? 예를 들어 Windows 기본 스케줄러 또는 nnCron (http://www.nncron.ru/)을 사용하여이 작업을 수행 할 수 있습니다. –

+1

Windows XP, Vista 및 Windows 7에서 예약 된 작업으로 좋은 결과를 얻었습니다. –

답변

16

나는 윈도우 서비스로하지 않을 것이다. 나는 그것을 예정된 작업으로 실행할 것이다.

귀하의 서비스는 한 달 동안 잠 들어있을 뿐이며 자원 낭비 일뿐입니다. 운영 체제가 시간을 추적하고 한 달에 한 번 처리하도록 응용 프로그램을 시작하게하십시오.

4

윈도우 서비스 작성을 피할 수 있다면 인생을 더 편하게 할 수 있습니다. 예약 된 작업이 더 좋은 옵션 일 수 있습니다. Windows 서비스는 긴 시간 규모의 작업을 실행하는 것이 아니라 일정한 백그라운드 작업이 필요한 작업에 가장 적합합니다.

그러나이 서비스를 Windows 서비스로 설정해야한다면 에 긴 타이머 절전 시간 제한을 설정하지 않으려합니다. 그건 분명히 문제가되는 접근법입니다. 응용 프로그램을 다시 시작하면 어떻게됩니까? 얼마나 오래 자고 있었는지 어떻게 알 수 있습니까? 또는 스레드가 다시 시작되면 어떻게됩니까?

더 나은 방법은 다음 가져 오기가 언제 날짜/시간으로 발생해야하는지 식별하는 데이터베이스 어딘가에 레코드를 쓰는 것입니다. Windows 서비스는 주기적으로 (몇 분 또는 몇 시간마다) 깨어나 현재 날짜/시간이 해당 값보다 큰지 확인합니다. 그럴 경우 가져 오기를 실행하고 데이터베이스에서 다음 실행 날짜를 다음에 실행하도록 업데이트하십시오.

앱을 다시 시작한 경우 데이터베이스에서 값을 읽고 이전과 같이 계속 진행하면됩니다.

+0

응용 프로그램을 다시 시작하면 어떻게됩니까? 레지스트리에서 마지막 검사 날짜 시간을 으로 읽으며 nowtime from registrytime> delta의 델타가> interval 인 경우 검사를 수행하면 현재 간격을 (interval- (nowtime-registrytime))으로 설정합니다. 물론 첫 번째 온 전성 검사 시계가 돌아 왔는지 여부. –

+0

@ user155077 : 당신은 분명히 당신이 묘사하고있는 것을 할 수는 있지만 거기에는 위험이 있습니다. 레지스트리 대신이 정보의 저장 위치로 데이터베이스를 사용하려고합니다. 서버에 치명적인 오류가 발생하여 시스템을 재 구축해야한다면 어떻게됩니까? 레지스트리에서 정보를 잃을 가능성이 큽니다. 그것은 원격 가능성이 있습니다 -하지만 나는 그것이 일어나는 것을 보았습니다. 그리고 안타깝게도 시스템 레지스트리는 거의 백업되지 않습니다. – LBushkin

+0

또한 환경에 따라 Windows 서비스가 레지스트리에 쓸 수 없다는 점을 언급 할 가치가 있습니다. 모든 것을 한 곳에서 보관하십시오. 데이터베이스 –

관련 문제