C # 타이머는 모든 x 초를 불어 넣지 만 실시간으로 동기화 상태 (즉, 드리프트가없는)

StackOverflow https://stackoverflow.com/questions/3296784

  •  18-09-2020
  •  | 
  •  

문제

이벤트 사이에 "드리프트"가 없도록 보장 할 수있는 C #에서 .NET 타이머가 있습니까?즉, 타이머를 X 초마다 꺼지도록 설정 한 경우, 작동하는 날이 드리프트되지 않습니다. 즉, 하루에 x 초 이벤트의 접근 수가 그대로 작동하는 것과 동기화 상태로 유지되는지 확인하십시오.

그렇지 않은 경우 C #에서 타이머 함수를 랩하는 잘 알려진 코드 예제가 있습니까?

도움이 되었습니까?

해결책

quartz.net 링크를 제공해서 죄송합니다. 그러나 이것은 완전한 기업입니다, 테스트, ... 라이브러리 ... 당신은 바퀴를 재발견 할 필요가 없습니다 :)

오버 헤드에 대해 걱정하면 오버 헤드에 대한 정의는 무엇입니까?파일 크기 (바이너리가 약 0,5MB) 또는 논리의 오버 헤드 인 것입니다. 논리 부분에 대해서는 IJob-interface를 구현하는 것이 소비자의 더 나은 코드를 강요하는 좋은 일을하는 것이 좋습니다.나는 인라인 - 메소드의 큰 친구가 아니에요 (예를 들어, 타이머 경로에 대한 포인터를 발사 할 수 있으므로) 수업은 당신에게 훨씬 더 많은 가능성을 줄 것입니다, 그리고 다시 한번 더 나은 OOP, 도메인 디자인, ...

그러나 : quartz.net으로 Console.WriteLine(...)를 수행하면 ... :)

다른 팁

이미 뭔가를 시도했는데, 그것이 드리프트하고 있다고 가정합니다.

시간 (5,10,15,20 ..)에서 5 초마다 5 초마다 화재 할 것을 원한다면 타이머를 한 번 발사 할 수 있고 콜백에서 타이머를 재설정하여 날짜 시간에 화재로 재설정 할 수 있습니다.. 이제 + 다음 단계에서 다음 5 초 간격까지.

시계가 올바른 경우에는 표류가 발생하지 않습니다.

이와 같은 것

System.Timers.Timer timer = new Timer();

void Init()
{
    timer.Elapsed += timer_Elapsed;
    int wait = 5 - (DateTime.Now.Second % 5);
    timer.Interval = wait*1000;
    timer.Start();
}


void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    timer.Stop();
    int wait = DateTime.Now.Second % 5;
    timer.Interval = wait * 1000;
    timer.Start();
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top