매월 말에 타이머를 작동시켜야합니다. 매달 마지막 날에 실행해야하는 코드가있는 작은 프로그램을 작성했으며이를 구현하는 방법을 모릅니다. 내 상사에게 Windows 스케줄러를 사용하여 제안했지만 타이머로 코드에서이 작업을 수행하기를 원합니다.매월 말에 타이머를 켭니다. C#
어떻게하면 되나요?
매월 말에 타이머를 작동시켜야합니다. 매달 마지막 날에 실행해야하는 코드가있는 작은 프로그램을 작성했으며이를 구현하는 방법을 모릅니다. 내 상사에게 Windows 스케줄러를 사용하여 제안했지만 타이머로 코드에서이 작업을 수행하기를 원합니다.매월 말에 타이머를 켭니다. C#
어떻게하면 되나요?
나는 상사가 창 계획된 작업을 사용하도록 설득 할 수 있었다. 타이머로이를 수행하는 방법이 있습니다. 아래에 코드를 포함합니다. 그것은 빠르고 더러운 것입니다. 이러한 종류의 작업을 구현하는 데 예약 된 작업 사용이 올바른 방법임을 강력히 유의하십시오.
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보다 복잡한 스케줄링 로직에 더 적합합니다.
제안 된 해결책은 실제로 일하기 시작한 인턴에서 오는 매우 나쁨입니다. 나는 제 시간에 돌아가서 상황이 어떻게 다르고 더 잘 될 수 있는지 깨닫게되어 기쁩니다.
상사가 주장하는 경우에도 타이머를 사용하지 마십시오. 완전히 바보 같으며 타이머는 몇 분 또는 몇 분 동안 - 한 달에 한 번이 아닙니다. Windows 예약 작업 기능을 사용하여 매월 1 회 앱을 시작하십시오. –
사장님이 단서를 찾지 못했다면, 그 사람은 타당하고/좋은 이유가있을 수 있습니다. 그 이유가 무엇인지 찾아보십시오. 아마 당신이 알지 못하는 다른 요구 사항이 생길 것입니다. (예 : 예정된 업무를 수행하기위한 작업을 신뢰하지 않습니다.) –
나는 수천 번 투표 할 것이지만, 불행히도 나는 여전히 시험 기간에 있습니다. –