2010-06-16 6 views
2

이 코드가 스레드로부터 안전한지 아는 사람이 있습니까? 아니면 timer2.Change를 호출 할 때 잠금을 사용해야합니까? MSDN 문서 당Timer (System.Threading) 스레드 안전

Timer timer1 = new Timer(timerCallback1); 
Timer timer2 = new Timer(timerCallback2); 
timer1.Change(5000, 5000); 
timer2.Change(3000, 3000); 

public void timerCallback1(object state) 
{ 
    timer1.Change(Timeout.Infinite, Timeout.Infinite); 
    timer2.Change(Timeout.Infinite, Timeout.Infinite); 

    DoStuff(); 

    timer1.Change(5000, 5000); 
    timer2.Change(3000, 3000); 
} 

답변

5

Change원에 대한 호출 실제로 타이머를 손상시킵니다.

그러나 경쟁 조건이 있다는 의미에서 "스레드 안전"이 아닙니다 (DoStuff에있을 때 timerCallback2이 실행되고 있지 않음을 보장 할 수 없음).

+0

고마워, 네, 어쩌면 내가 타이머를 완료하기 위해 DoStuff()하기 전에 수면을 할거야, 아니면 그냥 잠금을 추가 할 수 있습니다. – remdao

2

는 타이머 유형은 스레드 안전, 그래서 당신은 조심해야 유일한 장소 당신이 전화를 어디 DoStuff();. 그것은 의미에서 "스레드 안전"의

+0

"모든 인스턴스 멤버가 _ 스레드로부터 안전하지 않습니다"라는 내용을 읽었습니다. http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx –

+1

@Henk : 스레드 안전 인 Threading.Timer 클래스가 아니라 System.Timers 클래스에 있습니다. –

+0

예, 예 그렇지, 미안해. 틀린 타이머. –