temporizadores sentencia que libreria lenguaje funciona esta else ejemplos condiciones como comandos c# timer delay sleep

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.



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:

  1. Asegúrese de que su programa tenga .Net Framework 4.5 como Target Framework
  2. Marque su función que necesita dormir con la palabra clave async (ver ejemplo a continuación)
  3. 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);