dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Voglio aspettare un secondo prima di stampare le mie celle della griglia con questo codice, ma non funziona. Cosa posso fare?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Voglio aspettare un secondo prima di stampare le mie celle della griglia con questo codice, ma non funziona. Cosa posso fare?
Risposte:
È in pausa, ma non vedi il tuo colore rosso apparire nella cella? Prova questo:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
Personalmente penso che Thread.Sleep
sia una cattiva implementazione. Blocca l'interfaccia utente, ecc. Personalmente mi piacciono le implementazioni del timer poiché attende e poi si attiva.
Utilizzo: 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();
}
Funzione di attesa utilizzando timer, nessun blocco dell'interfaccia utente.
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();
}
}
Utilizzo: basta inserirlo nel codice che deve attendere:
wait(1000); //wait one second
L'attesa impegnativa non sarà un grave inconveniente se è breve. Nel mio caso c'era la necessità di dare un feedback visivo all'utente facendo lampeggiare un controllo (è un controllo grafico che può essere copiato negli appunti, che cambia lo sfondo per alcuni millisecondi). Funziona bene in questo modo:
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;
....
Mi sento come se tutto ciò che non andava qui fosse l'ordine, Selçuklu voleva che l'app aspettasse un secondo prima di riempire la griglia, quindi il comando Sleep avrebbe dovuto venire prima del comando di riempimento.
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
.Net Core sembra mancare di DispatcherTimer
.
Se siamo d'accordo con l'utilizzo di un metodo asincrono, Task.Delay
soddisferà le nostre esigenze. Questo può anche essere utile se vuoi aspettare all'interno di un ciclo for per motivi di limitazione della velocità.
public async Task DoTasks(List<Items> items)
{
foreach (var item in items)
{
await Task.Delay(2 * 1000);
DoWork(item);
}
}
Puoi attendere il completamento di questo metodo come segue:
public async void TaskCaller(List<Item> items)
{
await DoTasks(items);
}
usa dataGridView1.Refresh();
:)
Prova questa funzione
public void Wait(int time)
{
Thread thread = new Thread(delegate()
{
System.Threading.Thread.Sleep(time);
});
thread.Start();
while (thread.IsAlive)
Application.DoEvents();
}
Funzione di chiamata
Wait(1000); // Wait for 1000ms = 1s
Il modo migliore per aspettare senza congelare il thread principale è utilizzare la funzione Task.Delay .
Quindi il tuo codice sarà simile a questo
var t = Task.Run(async delegate
{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
await Task.Delay(1000);
});
Forse prova questo codice:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}