Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to put delay before doing an operation in WPF

I tried to use the below code to make a 2 second delay before navigating to the next window. But the thread is invoking first and the textblock gets displayed for a microsecond and landed into the next page. I heard a dispatcher would do that.

Here is my snippet:

tbkLabel.Text = "two mins delay"; Thread.Sleep(2000); Page2 _page2 = new Page2(); _page2.Show(); 
like image 881
BharathNadadur Avatar asked Mar 24 '13 14:03

BharathNadadur


1 Answers

The call to Thread.Sleep is blocking the UI thread. You need to wait asynchronously.

Method 1: use a 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();     }; 

Method 2: use Task.Delay

tbkLabel.Text = "two seconds delay";  Task.Delay(2000).ContinueWith(_ =>     {       var page = new Page2();      page.Show();    } ); 

Method 3: The .NET 4.5 way, use 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(); } 
like image 140
Phil Avatar answered Sep 22 '22 13:09

Phil