[英]C# countdown timer
我正在嘗試使用 C# 進行倒計時並以格式顯示時間:
hour:minutes:seconds
我試過這個:
var minutes = 3; //countdown time
var start = DateTime.Now;
var end = DateTime.Now.AddMinutes(minutes);
Thread.Sleep(1800);
if (??) // I tried DateTime.Now > end not works
{
//... show time
label1.Text = "...";
}
else
{
//done
label1.Text = "Done!";
}
也出現了解決這個問題的不同方法。 提前致謝
你不應該在這里使用Thread.Sleep
。 UI 線程上的Thread.Sleep
阻塞 UI,而在另一個線程上使用它會由於線程同步而導致額外的復雜性。
如果您有 C# 5 或異步 CTP,您可能可以編寫與您所做的非常相似的代碼,因為您將獲得基於延續的Thread.Sleep
等價物,它不會阻塞 UI。
在標准 C# 4 中,我會使用System.Windows.Forms.Timer
。
開始倒計時:
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;
在計時器處理程序中,您編寫:
TimeSpan remainingTime=endTime-DateTime.UtcNow;
if(remainingTime<TimeSpan.Zero)
{
label1.Text = "Done!";
timer1.Enabled=false;
}
else
{
label1.Text = remainingTime.ToString();
}
有關其他格式選項,請參閱標准時間跨度格式字符串。
此代碼仍然存在的一個問題是,如果系統時鍾發生變化,它將無法正常工作。
當使用DateTime.Now
而不是DateTime.UtcNow
它也會在切換到夏令時或更改時區時中斷。 由於您想標識某個時間點(而不是顯示時間),您應該使用 UTC 而不是本地時間。
我會使用這樣的計時器。 首先是幾個實例變量。
private int _countDown = 30; // Seconds
private Timer _timer;
並在構造函數或加載事件中
_timer = new Timer();
_timer.Tick += new EventHandler(timer_Tick);
_timer.Interval = 1000;
_timer.Start();
最后是事件處理程序
void timer_Tick(object sender, EventArgs e)
{
_countDown--;
if (_countDown < 1)
{
_countDown = 30;
}
lblCountDown.Text = _countDown.ToString();
}
您也可以使用Timer ,因為這可以處理所有問題,例如 UI 鎖定。 您可以使用System.Windows.Forms.Timer
-Timer。 在 MSDN 庫中,您可以找到使用它的示例。
WinForms-Timer 還處理跨 Timer 線程和 UI 線程的調用。
- SeriTools
您的代碼設置變量然后進入睡眠狀態 3 分鍾,這樣 if 語句在離開睡眠狀態之前不會執行。 要么設置一個新線程來更新用戶界面,要么做這樣的事情......
while (DateTime.now < end) {
label1.Text = "...";
Thread.Sleep(#); //Pick a second, or 5 or whatever
}
label1.Text = "Done!";
使用第二個線程,您仍然可以在程序運行時在程序中執行某些操作。 “完畢!” 完成后會出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.