2013-07-15 1 views
0

나는 이것이 어딘가에 있을지도 모른다라고 확신한다. 그러나 나는 웹상에서 수색을했고 분명한 해결책을 찾을 수 없다?WPF에서 C# 루핑 메서드

private void button5_Click(object sender, RoutedEventArgs e) 
{ 
    if (stopwatch.IsRunning == false) 
    { 
     stopwatch.Start(); 

     while (stopwatch.IsRunning == true) 
     { 
      label7.Content = stopwatch.Elapsed.ToString(); 
      Thread.Sleep(1000); 
     } 
    } 
} 

label7이 업데이트되지 않으며 while 루프가 종료되지 않기 때문에 그 것으로 가정합니다.

그러나 나는 기쁨도없이 이것을 시험해 보았습니까?

private void button5_Click(object sender, RoutedEventArgs e) 
{ 
    if (stopwatch.IsRunning == false) 
    { 
     stopwatch.Start(); 
    } 

    label7.Content = stopwatch.Elapsed.ToString(); 
    Thread.Sleep(1000); 

    button5_Click(sender, e); 
} 
+5

UI 스레드에서'Thread.Sleep()'을하면 애플리케이션이 멈추게됩니다. 당신은'DispatcherTimer'를 사용하거나'Task' 또는 뭔가에 코드를 넣어야합니다. –

+1

두 번째는 또한 무한 루프입니다. 너 뭐하려고? – Paparazzi

답변

0

타이머 클래스를 만들므로 Timer Elapsed 이벤트를 사용해야합니다. 거기에 UI를 업데이트하십시오. 말한 바와 같이

MSDN Timer Elapsed Event Description

, 프로세스 스레드를 자고하는 것은 기본적으로 응용 프로그램을 동결됩니다. 일반적으로 스레드를 잠자기해야하는 특별한 이유가 없으면 가능한 한 수행하지 마십시오. 1 초는 컴퓨터의 영원한 부분이기 때문에 경과 시간을 조금씩 늘려야합니다. 사용자는 1 초를 알게되며, 0.1 초 이하의 시간이 증가합니다.

2

거기에 Thread.Sleep (1000)을 사용하고 싶지 않습니다. 그러면 UI가 업데이트되지 않도록 할 것입니다. 타이머를 사용하고 타이머 틱 이벤트가 발생하면 레이블의 텍스트를 변경하십시오.

예를 들어 스톱워치를 정의 할 때 간격을 정의한 다음 'Tick'이벤트에 대한 이벤트 처리기를 추가하십시오. '틱'하면 레이블 내용을 설정하십시오.

타이머가 UI 스레드 내에서 작동하므로 DispatcherTimer를 사용하여 UI 스레드로 이동할 필요가 없습니다.

+1

+1 : OP에는 'DispatcherTimer'가 필요합니다. –