Attendi un secondo durante l'esecuzione del programma


104
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?


1
Quale codice dovrebbe essere eseguito dopo l'attesa di 1 secondo?
Allensb

1
Come fai a sapere che non funziona? Prova a dormire 10000 e vedi se funziona. 1000 è molto breve per valutare se funziona.
Missy

Funziona bene: System.Threading.Thread.Sleep (1000);
Andrew

Risposte:


177

È 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);

28

Personalmente penso che Thread.Sleepsia 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();
}

15

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

Solo un suggerimento. Se si moltiplica il min per 60000, il nome del parametro sarà più significativo. timer1.Interval = min * 60000;
Golda

Sì, hai ragione, dovrebbero essere millisecondi invece di min. Aggiornerò il nome. Grazie
Detto il

2

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;
....

2

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;

2

.Net Core sembra mancare di DispatcherTimer.

Se siamo d'accordo con l'utilizzo di un metodo asincrono, Task.Delaysoddisferà 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);
}

Questo è solo il modo perfetto. Grazie ! :)
Deniz


0

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

0

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);             
});

-4

Forse prova questo codice:

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

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

5
Questa è una valida soluzione. Tuttavia, è necessario aggiungere una descrizione dei suoi vantaggi e danni, ad esempio menzionando che, poiché si tratta di una soluzione di attesa impegnativa, richiederà tempo della CPU.

1
La soluzione più breve è la soluzione migliore
BASEER ULHASSAN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.