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?
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?
Respuestas:
¿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);
Personalmente creo que Thread.Sleep
es 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();
}
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
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;
....
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;
.Net Core parece faltar el DispatcherTimer
.
Si estamos de acuerdo con el uso de un método asincrónico, Task.Delay
satisfará 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);
}
usar dataGridView1.Refresh();
:)
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
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);
});
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;
}
}