Espere un segundo en el programa en ejecución


104
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

Quiero esperar un segundo antes de imprimir las celdas de mi cuadrícula con este código, pero no funciona. ¿Que puedo hacer?


1
¿Qué código se supone que debe ejecutarse después de la espera de 1 segundo?
Allensb

1
¿Cómo sabes que no funciona? Intente dormir 10000 y vea si está funcionando. 1000 es muy corto para evaluar si está funcionando.
Missy

Esto funciona bien: System.Threading.Thread.Sleep (1000);
Andrew

Respuestas:


177

¿Está pausando, pero no ve que su color rojo aparece en la celda? Prueba esto:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);

28

Personalmente creo que Thread.Sleepes una mala implementación. Bloquea la interfaz de usuario, etc. Personalmente, me gustan las implementaciones de temporizador, ya que espera y luego se activa.

Uso: DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));

//Note Forms.Timer and Timer() have similar implementations. 

public static void DelayAction(int millisecond, Action action)
{
    var timer = new DispatcherTimer();
    timer.Tick += delegate

    {
        action.Invoke();
        timer.Stop();
    };

    timer.Interval = TimeSpan.FromMilliseconds(millisecond);
    timer.Start();
}

15

Función de espera mediante temporizadores, sin bloqueos de UI.

public void wait(int milliseconds)
{
    var timer1 = new System.Windows.Forms.Timer();
    if (milliseconds == 0 || milliseconds < 0) return;

    // Console.WriteLine("start wait timer");
    timer1.Interval = milliseconds;
    timer1.Enabled  = true;
    timer1.Start();

    timer1.Tick += (s, e) =>
    {
        timer1.Enabled = false;
        timer1.Stop();
        // Console.WriteLine("stop wait timer");
    };

    while (timer1.Enabled)
    {
        Application.DoEvents();
    }
}

Uso: simplemente colocando esto dentro de su código que necesita esperar:

wait(1000); //wait one second

Sólo una sugerencia. Si multiplica el mínimo por 60000, el nombre del parámetro será más significativo. timer1.Interval = min * 60000;
Golda

Sí, tienes razón, debería ser milisegundos en lugar de min. Actualizaré el nombre. Gracias
Dijo el

2

La espera ocupada no será un grave inconveniente si es breve. En mi caso, existía la necesidad de dar retroalimentación visual al usuario mediante el flasheo de un control (es un control de gráfico que se puede copiar al portapapeles, que cambia su fondo por algunos milisegundos). Funciona bien de esta manera:

using System.Threading;
...
Clipboard.SetImage(bm);   // some code
distribution_chart.BackColor = Color.Gray;
Application.DoEvents();   // ensure repaint, may be not needed
Thread.Sleep(50);
distribution_chart.BackColor = Color.OldLace;
....

2

Siento que todo lo que estaba mal aquí era el orden, Selçuklu quería que la aplicación esperara un segundo antes de completar la cuadrícula, por lo que el comando Sleep debería haber venido antes que el comando fill.

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;

2

.Net Core parece faltar el DispatcherTimer.

Si estamos de acuerdo con el uso de un método asincrónico, Task.Delaysatisfará nuestras necesidades. Esto también puede ser útil si desea esperar dentro de un bucle for por razones de limitación de velocidad.

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

Puede esperar la finalización de este método de la siguiente manera:

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}

Esa es la manera perfecta. Gracias ! :)
Deniz


0

Prueba esta función

public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}

Función de llamada

Wait(1000); // Wait for 1000ms = 1s

0

La mejor manera de esperar sin congelar su hilo principal es usando la función Task.Delay .

Entonces tu código se verá así

var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});

-4

Tal vez pruebe este código:

void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);

    while (t < tf) {
        t = DateTime.Now;
    }
}

5
Ésta es una solución válida. Sin embargo, debe agregar una descripción de sus beneficios y daños, como mencionar que debido a que es una solución de espera ocupada, tomará tiempo de la CPU.

1
La solución más corta es la mejor solución
BASEER ULHASSAN
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.