2012-06-27 2 views
0

나는 적절한 이름을 질문하는 방법을 모르겠습니다. 제발 자유롭게 편집하십시오.트리거 12 시간 루프

내 서버에서 백그라운드 콘솔 응용 프로그램을 실행하고 있습니다. 콘솔 응용 프로그램은 전자 메일을 보내고 수시로 사소한 작업을 수행합니다 (매 5 분마다).

응용 프로그램은 작업 관리자를 통해 5 분마다 시작되지 않으며 설치 과정에서 한 번 열리고 무한 루프와 thread.sleep은 계속 실행됩니다. 따라서 특정 매개 변수를 사용하여 응용 프로그램을 열도록 작업 관리자를 구성 할 수 없습니다.

이제 12 시간마다 작업을 추가해야하며 동일한 응용 프로그램을 사용하고 싶습니다. 작업은 삭제로 구성되어 있으며 몇 개의 파일을 만들지 만 5 분마다 파일 날짜를 기준으로 마지막으로 생성 한 이후 12 시간이 지 났는지 확인합니다.

내가 가진 동일한 응용 프로그램을 사용하여 12 시간 루프를 틱하는 비싼 방법 (데이터베이스 없음, 로그 없음, 파일 생성 날짜 없음, 다중 스레드 없음)이 있습니까? 그렇지 않다면 어떻게해야할까요?

+3

의 라인을 따라 작업 B. 뭔가를 실행하면 당신은 http://quartznet.sourceforge.net/ – Blorgbeard

+0

볼 수 있습니다 또는 당신은 당신이 마지막으로 실행 시간을 기억하고 확인할 수 있습니다 12 시간 전에는 5 분짜리 과제가 나올 때마다. – Blorgbeard

+0

서비스로 실행 해 본 적이 있습니까? 나는 당신의 질문에 대답하지 않는다는 것을 안다 - 원래 질문을위한 선택권 - 2 개의 실을 - 그들의 자신의 타이머 목표를 가진 - 창조하고 각 작업을 위해 특정한 타이머를 놓으십시오. 제대로 완료되면 나중에 언제든지 3/4까지 확장 할 수 있습니다. 두 스레드간에 공유 리소스를 사용하는 것에주의하십시오. – tsells

답변

1

다음은 반복없이 자정 UTC에서 일정의 효율적인 수단을이다 :

var now=DateTime.UtcNow; 
var today=now.Date; 
var tomorrow=today.AddDays(1); 
var dueTime=tomorrow-now; 

System.Threading.Timer timer = null; 
timer = new Timer(_ => { 
    try 
    { 
     //do your thing 
    } 
    finally 
    { 
     timer.Dispose(); 
    } 
},null,dueTime,TimeSpan.FromMilliseconds(-1d)) 
1

내가 알고있는 것처럼, 당신은 이미 5 분 대기 루프를 한 다음 지금 당신이 원하는 작업 A를 않습니다 작업 B를 12 시간마다 실행하도록 추가합니다. 태스크 A가 실행될 때마다 Timer 오브젝트 또는 5 분마다 두 태스크를 바꿀 것입니다. 태스크 B가 실행 된 이후의 시간을 확인하십시오. 그 적어도 12 시간 후

if (last12HourRun.Subtract(DateTime.Now).TotalHours > 12) 
    // run task B 
    last12HourRun = DateTime.Now;