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?

Selçuklu Ebrar
fuente
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);
Matt Dawdy
fuente
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();
}
Mark Rowe
fuente
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
Dijo
fuente
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;
....
ChrisW
fuente
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;
Colin D
fuente
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);
}
Rich Hildebrand
fuente
Esa es la manera perfecta. Gracias ! :)
Deniz
1

usar dataGridView1.Refresh();:)

Codificador SAJDFJF
fuente
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
Savaş SERTER
fuente
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);             
});
amitklein
fuente
-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;
    }
}
Bartek Winslawski
fuente
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