sentencia - ¿Cómo puedo realizar un pequeño retraso en C#sin usar el modo de suspensión?
sentencia if else en c++ (5)
Soy increíblemente nuevo en programación, y he aprendido bastante bien hasta ahora, creo, pero todavía no puedo entender la idea de hacer una demora como quiero. En lo que estoy trabajando es en una especie de prueba de "juego" que usa una aplicación de formularios de Windows que involucra un sistema de combate. En él, quiero hacer un NPC que realice una acción cada dos segundos. El problema es que también quiero permitir que el jugador interactúe entre ataques. Thread.sleep realmente no parece funcionar para mí, no solo porque no sé cómo multithread, sino cada vez que trato de ejecutarlo, por ejemplo, así:
textBox1.Text += "/r/nThread Sleeps!";
System.Threading.Thread.Sleep(4000);
textBox1.Text += "/r/nThread awakens!";
Parece insistir en dormir primero y luego imprimir ambas líneas.
Creo que eso es todo lo que puedo decir en este momento, pero si todavía es demasiado vago o prolijo, no dudes en decírmelo.
En resumen, en C # quiero hacer algo de retraso antes de ejecutar pero, al mismo tiempo, permitir la interacción del usuario.
Probablemente pueda usar temporizadores: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
Los temporizadores pueden proporcionarle una precisión de hasta 1 milisegundo. Dependiendo del intervalo de tic, se generará un evento. Haz tus cosas dentro del evento tick.
Si está usando .NET 4.5, puede usar el nuevo marco async / await para dormir sin bloquear el hilo.
Cómo funciona es que marca la función que necesita operaciones asincrónicas, con la palabra clave async
. Esto es solo una pista para el compilador. Luego usa la palabra clave await
en la línea donde desea que su código se ejecute de forma asíncrona y su programa esperará sin bloquear el hilo o la interfaz de usuario. El método al que llama (en la línea de espera) también debe marcarse con una palabra clave async
y generalmente se denomina con el nombre Async, como en ImportFilesAsync .
Lo que debes hacer en tu ejemplo es:
- Asegúrese de que su programa tenga .Net Framework 4.5 como Target Framework
- Marque su función que necesita dormir con la palabra clave
async
(ver ejemplo a continuación) - Agregar
using System.Threading.Tasks;
a tu código
Su código ahora está listo para usar el método Task.Delay
lugar del método System.Threading.Thread.Sleep
(es posible utilizar Task.Delay
en Task.Delay
porque Task.Delay
está marcado con async
en su definición).
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Text += "/r/nThread Sleeps!";
await Task.Delay(3000);
textBox1.Text += "/r/nThread awakens!";
}
Aquí puede leer más sobre Task.Delay y Await .
Perdón por haber despertado una vieja pregunta como esta. Pero creo que lo que el autor original quería como respuesta fue:
Debe forzar su programa para realizar la actualización gráfica después de realizar el cambio en el cuadro de texto1. Puede hacerlo invocando Update();
textBox1.Text += "/r/nThread Sleeps!";
textBox1.Update();
System.Threading.Thread.Sleep(4000);
textBox1.Text += "/r/nThread awakens!";
textBox1.Update();
Normalmente esto se hará automáticamente cuando el hilo esté listo. Por ejemplo, presiona un botón, los cambios se realizan en el texto, el hilo muere y luego .Update()
se dispara y usted ve los cambios. (No soy un experto, así que realmente no puedo decirte cuándo fue despedido, pero es algo similar a esto de cualquier manera).
En este caso, realiza un cambio, pausa el hilo, y luego cambia el texto nuevamente, y cuando el hilo finalmente muere, se .Update()
el .Update()
. Esto hace que solo vea el último cambio realizado en el texto.
Experimentaría el mismo problema si tuviera una ejecución larga entre los cambios de texto.
private void WaitNSeconds(int seconds)
{
if (seconds < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(seconds);
while (DateTime.Now < _desired) {
Thread.Sleep(1);
System.Windows.Forms.Application.DoEvents();
}
}
Al agregar using System.Timers;
a su programa puede usar esta función:
private static void delay(int Time_delay)
{
int i=0;
// ameTir = new System.Timers.Timer();
_delayTimer = new System.Timers.Timer();
_delayTimer.Interval = Time_delay;
_delayTimer.AutoReset = false; //so that it only calls the method once
_delayTimer.Elapsed += (s, args) => i = 1;
_delayTimer.Start();
while (i == 0) { };
}
El retraso es una función y puede usarse como:
delay(5000);