web-dev-qa-db-ja.com

WPFで操作を行う前に遅延を設定する方法

次のウィンドウに移動する前に、次のコードを使用して2秒の遅延を試みました。しかし、スレッドが最初に呼び出され、テキストブロックがマイクロ秒表示され、次のページに到達します。ディスパッチャーがそうするだろうと聞きました。

これが私のスニペットです。

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

Thread.Sleepの呼び出しは、UIスレッドをブロックしています。非同期に待機する必要があります。

方法1: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:Task.Delayを使用する

tbkLabel.Text = "two seconds delay";

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

方法3:.NET 4.5の方法、async/awaitを使用する

// 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();
}
76
Phil