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. publicstaticvoidDelayAction(int millisecond,Action action){var timer =newDispatcherTimer();
timer.Tick+=delegate{
action.Invoke();
timer.Stop();};
timer.Interval=TimeSpan.FromMilliseconds(millisecond);
timer.Start();}
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 neededThread.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.
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.
publicasyncTaskDoTasks(List<Items> items){foreach(var item in items){awaitTask.Delay(2*1000);DoWork(item);}}
Puede esperar la finalización de este método de la siguiente manera:
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(asyncdelegate{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor=System.Drawing.Color.Red;
dataGridView1.Refresh();awaitTask.Delay(1000);});
É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.
Respuestas:
¿Está pausando, pero no ve que su color rojo aparece en la celda? Prueba esto:
fuente
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(); }));
fuente
Función de espera mediante temporizadores, sin bloqueos de UI.
Uso: simplemente colocando esto dentro de su código que necesita esperar:
fuente
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:
fuente
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.
fuente
.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.Puede esperar la finalización de este método de la siguiente manera:
fuente
usar
dataGridView1.Refresh();
:)fuente
Prueba esta función
Función de llamada
fuente
La mejor manera de esperar sin congelar su hilo principal es usando la función Task.Delay .
Entonces tu código se verá así
fuente
Tal vez pruebe este código:
fuente