2012-03-14 2 views
3

타이머가 실행 중일 때 (1000ms 간격으로) 특정 동작을 수행하는 타이머가 있습니다. 타이머가 지연을 시작하지 못하도록 방지하고 처음에는 대신 함수로 들어가서 코드?타이머가 처음 시작될 때 지연을 시작하는 것을 방지하는 방법은 무엇입니까?

private void timer_Tick(object sender, EventArgs e) 
{ 
    labelStatus.Text = "Waiting for next file" + "(" + (class.property/1000).ToString("#0.##0") + " seconds)"; 
    class.property -= 1000; 
} 

내가 타이머 대신 당신이 Timer_Elapsed 이벤트로 실행되는 코드를 추출하고를 만드는 것을 방지 무엇 첫 번째 레이블 업데이트

+2

사용되는 하나 .NET에서 여러 개의 타이머가있다? 코드를 보여주십시오. –

+0

Winform 타이머를 사용 중입니다 – user1269592

+0

방금 ​​직접 메서드를 호출 할 수 있습니까? OnTick의 메소드는 바로 호출 할 수 있습니다. –

답변

3

전에 1 초를 기다리는 (라벨을 업데이트) 계산을 즉시 시작합니다 독립형 프로 시저 (일명 리팩터링).
일단 프로 시저를 호출하기 전에 타이머를 시작하기 직전에 호출하십시오.

이에서 예를 들어

:

private void Timer_Elapsed(object sender, TimerElapsedEventArgs e) 
{ 
    int a = 0; 
    for(i=0; i<100;i++) 
     a += i; 
} 

private void Timer_Elapsed(object sender, TimerElapsedEventArgs e) 
{ 
    ExecuteCalc(); 
} 
private void ExecuteCalc() 
{ 
    int a = 0; 
    for(i=0; i<100;i++) 
     a += i; 
} 

.... 및 코드에서 :

ExecuteCalc(); 
Timer1.Enabled = true; 
+0

내 목록 상자에 파일이 있습니다. 다음 파일에 3 초 이상 지연이있을 경우 bool 변수가 true 및보다 변경됩니다. 메인 GUI 내가이 클래스 (BackgroundWorker)와 함께 그리고 나서 타이머를 시작하고 (다른 변수) 카운트 다운해야합니다 초의 수를 읽고 있지만 내 문제는 타이머가 기능 항목에 남아있을 것입니다 카운트 다운 완료보다 1 초 전에 – user1269592

+0

내가 무슨 일을하는지 이해하지 못 했어 – user1269592

3

당신은, 당신을 어떻게 오히려 그것에 대해 것보다 당신이 그것을 가능하게하기 바로 전에 틱 할 때 당신의 타이머가 가정하는 코드를 간단히 실행할 수 있습니다.

예 :

public Main() 
{ 
    DoWork(); 
    Timer1.Enabled = true; 
} 


protected void Timer1_Tick(object sender, args e) 
{ 
    DoWork(); 
} 
0

이처럼 틱 핸들러에 그냥 "가짜"호출 할 수 있습니다

timer_Tick(null, null); 

먼저 타이머를 시작할 때. 그러나 이것은 나쁜 형식이며 코드 (리팩토링)를 메서드로 추출하고 메서드를 호출하는 것이 좋습니다. 당신에게 보여 주었다

private void timer_Tick(object sender, EventArgs e) 
{ 
    UpdateLabel(); 
} 

private UpdateLabel() 
{ 
    labelStatus.Text = "Waiting for next file" + "(" + (class.property/1000).ToString("#0.##0") + " seconds)"; 
    class.property -= 1000; 
} 

지금 바로 제프처럼 전화 : 스티브 언급 한 바와 같이 그런 다음 핸들러가 같은 메소드를 호출해야

UpdateLabel(); 
timer.Enable = true; 
+0

나는 UpdateLabel()이 무슨 일을하는지 이해하지 못했다. 어디 라인을 넣어 타이머 _Tick (null, null)? – user1269592

+0

@ user1269592 : UpdateLabel()을 이해하지 못한다는 것은 무엇을 의미합니까? 그것은 당신의 코드입니다! 나는 당신의 질문에서 그것을 베꼈다! 내가 말했듯이, timer_Tick 라인에 관해서는, 그것을하지 마십시오. 리팩터링하고 UpdateLabel (또는 원하는 호출)을 대신 호출하십시오. 처음부터 타이머를 시작하는 코드는 어디에 있습니까?마지막 스 니펫에서 보여 드렸던 것처럼 UpdateLabel을 호출하십시오. –

+0

나는 당신의 예제를 시도하지만 같은 결과를 얻을 수있다. 어쩌면이게 도움이 될 수있다. http://csharptips.wordpress.com/tag/system-threading-timer/ 누군가가 나를 어떻게 보여줄 수 있는지 기뻐하겠다. 그것을 쓰려면 (나는 성공하지 않으려 고 노력한다) – user1269592

관련 문제