C#倒计时计时器

C#倒计时计时器,c#,.net,winforms,datetime,countdown,C#,.net,Winforms,Datetime,Countdown,我正在尝试使用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 { /

我正在尝试使用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!"; 
  }

解决这个问题的不同方法也出现了。提前感谢

您的代码设置了变量,然后进入睡眠状态3分钟,因此if语句在离开睡眠状态之前不会执行。要么设置一个新线程来更新UI,要么执行类似的操作

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

label1.Text = "Done!";
while(DateTime.now

使用第二个线程,您仍然可以在程序运行时在程序中执行某些操作。“完成!”将在完成后显示。

您不应在此处使用
线程。睡眠
线程。睡眠
会阻塞UI,在另一个线程上使用它会由于线程同步而导致额外的复杂性

如果你有C#5或异步CTP,你可能可以编写与你所做的非常相似的代码,因为你会得到一个基于续集的等价物
Thread.Sleep
,它不会阻塞UI

在标准C#4中,我会使用一个

要开始倒计时,请执行以下操作:

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();
}
TimeSpan remainingTime=endTime-DateTime.UtcNow;

如果(remainingTime我会使用类似这样的计时器。首先是几个实例变量

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();
}
void timer\u Tick(对象发送方,事件参数e)
{
_倒计时--;
如果(_倒计时<1)
{
_倒计时=30;
}
lblCountDown.Text=_countDown.ToString();
}
您还可以使用计时器,因为它可以处理所有问题,如UI锁定。 您可以使用
System.Windows.Forms.Timer
-Timer。在MSDN库中,您可以找到使用它的示例

WinForms计时器还处理跨计时器线程和UI线程的调用


-SeriTools

如果你想定期更新标签,你需要一个类似循环的东西。@javasocute如果他这样做了,我会怀疑他的理智。这是Winforms,而.net有完美的机制来处理这些东西。不需要为这么小的事情引入javascript。使用计时器,而不是
Thread.Sleep()
。使用睡眠是对线程的浪费。太棒了,谢谢,我心里不是一个C#家伙,只是在构建他的代码。预算线程是一个很好的实践,但不是一个要求。主要的警告是,如果正在使用UI,会锁定UI。非常感谢!+1的好答案,但我在Statant中有一个问题:
错误:Operator'@TheM请使用
TimeSpan.Zero
而不是
0
CodeInChaos:事情真的很有效的人。工作很完美。非常感谢。:)+1的工作代码。不过有一个简单的问题,您提到现在不要使用,而是使用UtcNow。我已经用这两个选项进行了检查,两种方法都很好。有什么具体的原因让你现在更喜欢UtcNow吗?@Rahul我的最后一段已经提到了这一点。如果您的代码在夏令时打开/关闭时运行,则
DateTime.Now
将跳转一小时。还有一个更具哲理的原因是,我认为
DateTime
的设计在处理本地时间时不是很好,所以我尽可能避免使用它们。