2013-03-24 3 views
16

다음 코드를 사용하여 다음 창으로 이동하기 전에 2 초의 지연을 만들려고했습니다. 그러나 스레드가 먼저 호출하고 있으며 텍스트 블록이 마이크로 초 동안 표시되고 다음 페이지로 넘어갑니다. 나는 파견자가 그것을 할 것이라고 들었다.WPF에서 작업을 수행하기 전에 지연을 넣는 방법

tbkLabel.Text = "two mins delay"; 
Thread.Sleep(2000); 
Page2 _page2 = new Page2(); 
_page2.Show(); 
+0

DispatcherTimer

tbkLabel.Text = "two seconds delay"; var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) }; timer.Start(); timer.Tick += (sender, args) => { timer.Stop(); var page = new Page2(); page.Show(); }; 

방법 2를 사용하여 왜 "2 ** 분 ** 지연?" –

답변

56

에 Thread.sleep에 대한 호출은 UI 스레드를 차단 :

여기 내 코드 조각입니다. 비동기 적으로 기다려야합니다.

방법 1 : Task.Delay

tbkLabel.Text = "two seconds delay"; 

Task.Delay(2000).ContinueWith(_ => 
    { 
    var page = new Page2(); 
    page.Show(); 
    } 
); 

방법 3을 사용/닷넷 4.5 방식 사용 비동기 기다리고

// we need to add the async keyword to the method signature 
public async void TheEnclosingMethod() 
{ 
    tbkLabel.Text = "two seconds delay"; 

    await Task.Delay(2000); 
    var page = new Page2(); 
    page.Show(); 
} 
+0

방법 1은 타이머가 여러 번 틱하고 앱이 너무 느려 첫 번째 페이지를 처리하는 경우 새 페이지를 여러 번 표시 할 수 있습니다. – usr

+3

@usr 사실 그것은 그렇지 않습니다. 내부적으로 타이머는 단일 샷이며 Tick 이벤트를 발생시킨 후 다시 시작됩니다. – Phil

+0

누가 알았습니까?! 나는하지 않았다. +1 – usr

관련 문제