Queremos darte la mejor respuesta que descubrimos en todo internet. Nosotros esperamos que te sirva de ayuda y si puedes aportar alguna mejora siéntete libre de hacerlo..
Solución:
no debes usar Thread.Sleep
aquí. Thread.Sleep
en el subproceso de la interfaz de usuario bloquea la interfaz de usuario y su uso en otro subproceso genera una complejidad adicional debido a la sincronización del subproceso.
Si tiene C# 5 o el CTP asíncrono, probablemente pueda escribir un código muy similar al que hizo, ya que obtiene un equivalente basado en la continuación de Thread.Sleep
que no bloquea la interfaz de usuario.
En C# 4 estándar, usaría un System.Windows.Forms.Timer
.
Para iniciar la cuenta regresiva:
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;
En el controlador del temporizador escribes:
TimeSpan remainingTime=endTime-DateTime.UtcNow;
if(remainingTime
Para otras opciones de formato, consulte Cadenas de formato de intervalo de tiempo estándar.
Un problema que persiste con este código es que no funcionará correctamente si cambia el reloj del sistema.
Cuando usas DateTime.Now
en vez de DateTime.UtcNow
también se interrumpirá al cambiar de/a horario de verano o cambiar la zona horaria. Dado que desea identificar un determinado punto en el tiempo (y no una hora de visualización), debe usar UTC en lugar de la hora local.
Yo usaría un temporizador como este. Primero un par de variables de instancia.
private int _countDown = 30; // Seconds
private Timer _timer;
y en el constructor o evento de carga
_timer = new Timer();
_timer.Tick += new EventHandler(timer_Tick);
_timer.Interval = 1000;
_timer.Start();
y finalmente el controlador de eventos
void timer_Tick(object sender, EventArgs e)
_countDown--;
if (_countDown < 1)
_countDown = 30;
lblCountDown.Text = _countDown.ToString();
Si eres capaz, tienes la habilidad dejar una sección acerca de qué te ha parecido esta división.