2011-09-08 3 views
1

사용하는 UI를 업데이트 할 수있는 방법이 내가 사용하는 기능입니다 :내가 Thread.sleep를

private void Convert2Morse(object obj) 
    { 
     TextConverted = am.Convert(NormalText); 

     foreach (char symbol in TextConverted) 
     { 
      int milliseconds = 0; 

      switch (symbol) 
      { 
       case '·': milliseconds = 500; break; 
       case '—': milliseconds = 1000; break; 
       case ' ': continue; 
       default: throw new Exception("Something is wrong"); 
      } 

      System.Media.SystemSounds.Beep.Play(); 
      System.Threading.Thread.Sleep(milliseconds); 
     } 
    } 

TextConverted 속성은 텍스트 상자에 보여되지만 서브 루틴을 완료 할 때까지 새로 고쳐집니다.

새로 고침 UI를 표시 할 수있는 방법이 있습니까?

+1

[이 질문에] (http://stackoverflow.com/questions/6117293/synchronous-wait-without-blocking-the-ui-thread/6117313) 유사/관련성이있는 것 같습니다. –

답변

5

UI 스레드에서 절대로 절대로 안됩니다. 못. 이제까지.

소리를 재생하려면 새 스레드를 만들어야합니다.

+0

죄송합니다, 저는 WPF의 전문가가 아닙니다. 이 서브 루틴은 명령 (버튼)을 눌러 실행됩니다. 새로운 실을 말하면 무엇을 의미합니까? – Darf

+0

@OscarFimbres : 새로운 [스레드] (http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx). 참고 항목 : [스레드 및 스레딩] (http://msdn.microsoft.com/en-us/library/6kac2kdh.aspx) –

1

WPF 응용 프로그램 내에서 동일한 프로세스 내에서 활성 인 컨트롤의 독립적 인 흐름을 여러 개의 "스레드"로 가질 수 있습니다.

코드에서 취한 접근 방식은 사용자 인터페이스 스레드에서 모든 일이 발생합니다.이 스레드는 화면을 다시 그리는 데 책임이 있습니다. 이 스레드가 모스 코드 루틴을 실행 중일 때, 다시 칠할 수 없습니다.

당신이해야 할 일은 모스 코드 루틴의 실행을 별도의 스레드로 옮기는 것입니다. 그러면 UI 스레드가시기 적절하게 다시 그리기를 처리 할 수 ​​있습니다. 이것을 달성하는 가장 쉬운 방법은 BackgroundWorker 개체를 사용하는 것입니다. (이 예제에서는 WinForms를 사용하는 대부분의 예제를 볼 수 있지만 WPF에서도 제대로 작동합니다.)

그러나 개발이 다소 복잡해졌습니다. @EboMike에 대한 귀하의 의견을 토대로이 문제를 발견하게 될 것입니다 - 많은 새로운 개념의이 있습니다. 시작할 수있는 좋은 곳은 CodeProject에 Beginners guide to threading 일 수 있습니다. (나는 Google 검색에서 이것을 발견했으며 처음 몇 단락은 Ok - YMMV로 읽었습니다.)

행운을 빈다.