2013-05-16 3 views
1

매월 말에 타이머를 작동시켜야합니다. 매달 마지막 날에 실행해야하는 코드가있는 작은 프로그램을 작성했으며이를 구현하는 방법을 모릅니다. 내 상사에게 Windows 스케줄러를 사용하여 제안했지만 타이머로 코드에서이 작업을 수행하기를 원합니다.매월 말에 타이머를 켭니다. C#

어떻게하면 되나요?

+8

상사가 주장하는 경우에도 타이머를 사용하지 마십시오. 완전히 바보 같으며 타이머는 몇 분 또는 몇 분 동안 - 한 달에 한 번이 아닙니다. Windows 예약 작업 기능을 사용하여 매월 1 회 앱을 시작하십시오. –

+0

사장님이 단서를 찾지 못했다면, 그 사람은 타당하고/좋은 이유가있을 수 있습니다. 그 이유가 무엇인지 찾아보십시오. 아마 당신이 알지 못하는 다른 요구 사항이 생길 것입니다. (예 : 예정된 업무를 수행하기위한 작업을 신뢰하지 않습니다.) –

+0

나는 수천 번 투표 할 것이지만, 불행히도 나는 여전히 시험 기간에 있습니다. –

답변

0

나는 상사가 창 계획된 작업을 사용하도록 설득 할 수 있었다. 타이머로이를 수행하는 방법이 있습니다. 아래에 코드를 포함합니다. 그것은 빠르고 더러운 것입니다. 이러한 종류의 작업을 구현하는 데 예약 된 작업 사용이 올바른 방법임을 강력히 유의하십시오.

private Timer timer; 

    public MyClass() 
    { 
     timer = new Timer(); 
     timer.Elapsed += TimerElapsed; 
    } 

    private void TimerElapsed(object sender, ElapsedEventArgs elapsedEventArgs) 
    { 

     if (DateTime.Now.Day == DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month))// is it the last day of this month 
     { 
      ClientStatsController.FireAll(); 
     } 

     Thread.Sleep(TimeSpan.FromMinutes(5)); 
     timer.Interval = CalculateInterval(); 
     TimeSpan interval = new TimeSpan(0, 0, 0, 0, (int)timer.Interval); 

    } 

    // Helper functions 
    private static TimeSpan From24HourFormat(string value) 
    { 
     int hours = Convert.ToInt32(value.Substring(0, 2)); 
     int mins = Convert.ToInt32(value.Substring(2, 2)); 

     return TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(mins); 
    } 

    private double CalculateInterval() 
    { 
     string runtimeValue = ConfigController.AppSettings["runTime"]; // just a simple runtime string like 0800 
     double runTime = From24HourFormat(runtimeValue).TotalMilliseconds; 
     if (DateTime.Now.TimeOfDay.TotalMilliseconds < runTime) 
     { 
      return runTime - DateTime.Now.TimeOfDay.TotalMilliseconds; 
     } 
     else 
     { 
      return (From24HourFormat("2359").TotalMilliseconds - DateTime.Now.TimeOfDay.TotalMilliseconds) + runTime; 
     } 
    } 

편집

나는 내 모든 이전의 질문과 답변을 통해가는 시작했다.

타이머 사용은 매우 나쁜 생각입니다. 예정된 작업을 위해 당신은 그것을 사용하고 싶습니다. 스케줄러. Windows는 알맞은 작업 스케줄러를 제공하지만 더 복잡한 예약 논리 및 백그라운드 작업이있는 경우 적절한 타사 라이브러리를 사용하는 것이 좋습니다.

.NET의 두 가지 뛰어난 기능은 Hangfire와 Quartz입니다.

Hangfire는 대시 보드가 포함되어 있으며 특히 .NET 코어 플랫폼에서 작업하는 경우 매우 쉽게 구현할 수 있습니다.

Quartz는 또한 매우 좋은 솔루션이며 더 많은 스케줄링 옵션을 갖고 있으며 Hangfire보다 복잡한 스케줄링 로직에 더 적합합니다.

제안 된 해결책은 실제로 일하기 시작한 인턴에서 오는 매우 나쁨입니다. 나는 제 시간에 돌아가서 상황이 어떻게 다르고 더 잘 될 수 있는지 깨닫게되어 기쁩니다.

관련 문제