41

次のウィンドウに移動する前に、以下のコードを使用して2秒の遅延を作成しようとしました。ただし、スレッドが最初に呼び出され、テキストブロックがマイクロ秒表示されて次のページに移動します。コーディネーターがそうするだろうと聞きました。

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

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

2 に答える 2

109

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();
}
于 2013-03-24T15:02:35.493 に答える
0

方法4:.NET 5.0+

    Task.WaitAll(new Task[] { Task.Delay(2000) });

このソリューションには欠点はありません。「DispatcherTimer」と「ContinueWith」が不可能なループで使用できます。

于 2021-11-12T13:20:02.080 に答える