C#倒计时器

我正在尝试使用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,您可能可以编写与您所做的非常相似的代码,因为您将获得一个基于continuation的等效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格式字符串 。

此代码仍然存在的一个问题是,如果系统时钟发生变化,它将无法正常工作。

当使用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(); } 

您的代码设置变量然后进入睡眠状态3分钟,因此if语句在离开睡眠状态之前不会执行。 设置一个新的线程来更新UI或做这样的事情……

 while (DateTime.now < end) { label1.Text = "..."; Thread.Sleep(#); //Pick a second, or 5 or whatever } label1.Text = "Done!"; 

使用第二个线程,您仍然可以在程序中执行某些操作。 “搞定!” 一旦完成就会出现。

您也可以使用Timer ,因为它可以处理UI锁定等所有问题。 您可以使用System.Windows.Forms.Timer -Timer。 在MSDN库中,您可以找到使用它的示例。

WinForms-Timer还处理Timer-thread和UI-thread之间的调用。

– SeriTools