繁体   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