Bạn không nên sử dụng Thread.Sleep
tại đây. Thread.Sleep
trên chuỗi giao diện người dùng chặn giao diện người dùng và sử dụng nó trên một chuỗi khác dẫn đến sự phức tạp bổ sung do đồng bộ hóa luồng.
Nếu bạn có C# 5 hoặc CTP không đồng bộ, bạn có thể viết mã rất giống với những gì bạn đã làm, vì sau đó bạn nhận được số tương đương dựa trên số Thread.Sleep
không chặn giao diện người dùng.
Trong tiêu chuẩn C# 4, tôi muốn sử dụng số System.Windows.Forms.Timer
.
Để bắt đầu đếm ngược:
var minutes = 3; //countdown time
var start = DateTime.UtcNow; // Use UtcNow instead of Now
endTime = start.AddMinutes(minutes); //endTime is a member, not a local variable
timer1.Enabled = true;
Trong xử lý timer bạn viết:
TimeSpan remainingTime=endTime-DateTime.UtcNow;
if(remainingTime<TimeSpan.Zero)
{
label1.Text = "Done!";
timer1.Enabled=false;
}
else
{
label1.Text = remainingTime.ToString();
}
Đối với tùy chọn định dạng khác nhìn thấy Standard TimeSpan Format Strings.
Một vấn đề tồn tại với mã này là nó sẽ không hoạt động chính xác nếu đồng hồ hệ thống thay đổi.
Khi sử dụng DateTime.Now
thay vì DateTime.UtcNow
nó cũng sẽ bị ngắt khi chuyển từ/sang chế độ tiết kiệm ánh sáng ban ngày hoặc thay đổi múi giờ. Vì bạn muốn xác định một điểm nhất định trong thời gian (và không phải là thời gian hiển thị), bạn nên sử dụng UTC thay vì giờ địa phương.
Nếu bạn muốn cập nhật định kỳ nhãn, bạn sẽ cần thứ gì đó giống như vòng lặp. – svick
@javasocute Tôi đã làm, tôi có những nghi ngờ về sự tỉnh táo của anh ấy. Đây là Winforms, và .net có các cơ chế hoàn hảo để xử lý những thứ như vậy. Không cần phải mang theo javascript cho một điều nhỏ như vậy. – CodesInChaos