2012-11-07 3 views
7

가능한 복제를 완료하는 데 threading.Timer의 일시 정지 :
Synchronizing a timer to prevent overlap어떻게 기능을

내 클래스의 Threading.Timer 있습니다.

System.Threading.Timer timer; 
TimerCallback cb = new TimerCallback(ProcessTimerEvent); 
timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds)); 

콜백을 정의했습니다.

private void ProcessTimerEvent(object obj) 
{ 
    if(value) 
    MyFunction(); 
} 

실행할 때 완료하려면 myfunction 전에 콜백을 다시 실행하십시오.

Threading.Timer을 잠시 멈추는 방법 myfunction을 완료 하시겠습니까?

+0

난 당신이 [타이머 중복]을 방지하려는 생각 (http://stackoverflow.com/questions/684200/synchronizing-a-timer-to-prevent-overlap). –

답변

14

타이머를 중지 할 필요는 없습니다. 타이머가 콜백 메서드를 계속 실행하지만 재진입이 불가능한 코드는 Monitor.TryEnter/Exit에서 래핑 할 수 있습니다. 이 경우 타이머를 중지/다시 시작할 필요가 없습니다. 중첩 호출은 잠금을 획득하지 않고 즉시 반환합니다.

object lockObject = new object(); 

private void ProcessTimerEvent(object state) 
{ 
    if (Monitor.TryEnter(lockObject)) 
    { 
    try 
    { 
     // Work here 
    } 
    finally 
    { 
     Monitor.Exit(lockObject); 
    } 
    } 
} 
+0

+1 좋은 해결책. –

6

간격을 변경하여 System.Threading.Timer을 비활성화 할 수 있습니다. 당신은 호출하여이 작업을 수행 할 수 있습니다

timer.Change(Timeout.Infinite, Timeout.Infinite); 

당신은 타이머가 다시 발사 계속하려는 경우가 myfunction를 호출 완료되면 다시 간격을 변경해야합니다.

관련 문제