2013-03-24 29 views
16

Tôi đã cố gắng sử dụng mã bên dưới để thực hiện chậm trễ 2 giây trước khi điều hướng đến cửa sổ tiếp theo. Nhưng thread được gọi đầu tiên và textblock được hiển thị trong một micro giây và được đưa vào trang tiếp theo. Tôi nghe nói một người điều phối sẽ làm điều đó.Cách trì hoãn trước khi thực hiện một thao tác trong WPF

Dưới đây là đoạn mã của tôi:

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

Tại sao "hai ** ** ** chậm trễ?" –

Trả lời

56

Lời kêu gọi Thread.Sleep chặn thread UI. Bạn cần đợi không đồng bộ.

Phương pháp 1: sử dụng một 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(); 
    }; 

Cách 2: sử dụng Task.Delay

tbkLabel.Text = "two seconds delay"; 

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

Phương pháp 3: Cách .NET 4.5, sử dụng async/chờ đợi

// 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

Phương pháp 1 có thể hiển thị trang mới nhiều lần trong trường hợp bộ đếm thời gian đánh dấu nhiều lần và ứng dụng xử lý quá chậm lần đầu tiên. – usr

+3

@usr Thực ra là không. Nội bộ hẹn giờ là một shot duy nhất và được khởi động lại sau khi tăng sự kiện Tick. – Phil

+0

ai biết ?! Tôi đã không. +1 – usr

Các vấn đề liên quan