簡體   English   中英

C#倒數計時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM