次のウィンドウに移動する前に、以下のコードを使用して2秒の遅延を作成しようとしました。ただし、スレッドが最初に呼び出され、テキストブロックがマイクロ秒表示されて次のページに移動します。コーディネーターがそうするだろうと聞きました。
これが私のスニペットです:
tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
次のウィンドウに移動する前に、以下のコードを使用して2秒の遅延を作成しようとしました。ただし、スレッドが最初に呼び出され、テキストブロックがマイクロ秒表示されて次のページに移動します。コーディネーターがそうするだろうと聞きました。
これが私のスニペットです:
tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
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();
}
方法4:.NET 5.0+
Task.WaitAll(new Task[] { Task.Delay(2000) });
このソリューションには欠点はありません。「DispatcherTimer」と「ContinueWith」が不可能なループで使用できます。