db의 특정 테이블을 60 초마다 확인하는 Windows 서비스를 만들었습니다. 추가 된 모든 새로운 행에 대해 서버에서 60 초 이상 걸릴 수있는 무거운 프로세싱을 수행해야합니다.이전 스레드가 여전히 바쁠 경우 Timer가 틱을 건너 뛰게하는 방법
저는 서비스에서 Timer 객체를 만들었습니다. Timer 객체는 매 60 초마다 틱하고 원하는 메서드를 호출합니다.
발견 된 새 행을 처리하는 동안이 타이머를 틱하지 않으려면 lock { }
블록의 메서드를 래핑 했으므로 다른 스레드가 액세스 할 수 없습니다. 내가 궁금하네요 지금
Timer serviceTimer = new Timer();
serviceTimer.Interval = 60;
serviceTimer.Elapsed += new ElapsedEventHandler(serviceTimer_Elapsed);
serviceTimer.Start();
void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (this)
{
// do some heavy processing...
}
}
- 내 타이머 틱 경우
을하고, DB에 새로운 행을 많이 발견, 지금은 처리가 이상 걸릴 것
그것은 다음과 같이 보입니다 60 초가 지나면 이전 틱이 끝날 때까지 다음 틱은 아무런 처리도하지 않습니다. 이것이 내가 원하는 효과이다.
하지만 이제 첫 번째 처리가 완료되면 serviceTimer_Elapsed 메소드가 즉시 종료되거나 타이머가 다시 똑딱 거리기를 기다릴 것입니다.
내가 원하는 것은 - 처리가 60 초 이상 필요한 경우 타이머가 스레드가 잠겨 있음을 감지하고 다시 확인하기 위해 60 초 기다렸으므로 다시는 확인하지 않아도됩니다. 이전의 thread가 종료 할 때까지 대기하고있는 thread의 큐
어떻게이 결과를 얻을 수 있습니까?
이렇게하는 것이 가장 좋은 방법은 무엇입니까?
감사합니다.
사용하지 마십시오'잠금 (이)'-에 http : // stackoverflow.com/questions/251391/why-is-lockthis-bad –
autoreset을 false로 설정하는 것이 더 쉬울 것입니다. 그런 다음 아무 것도 잠글 필요가 없습니다. – javapowered