144 votes

Attendez une seconde dans le programme en cours d'exécution

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

Je veux attendre une seconde avant d'imprimer mes cellules de grille avec ce code, mais cela ne fonctionne pas. Qu'est-ce que je peux faire ?

235voto

Matt Dawdy Points 5479

Est-il en pause, mais vous ne voyez pas votre couleur rouge apparaître dans la cellule ? Essayez ceci :

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);

42voto

Mark Rowe Points 741

Personnellement, je pense que Thread.Sleep est une mauvaise mise en œuvre. Il verrouille l'interface utilisateur, etc. Personnellement, j'aime les implémentations de minuterie puisqu' elles attendent puis se déclenchent.

Utilisation : 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();
}

29voto

Said Points 143

Fonction d'attente à l'aide de minuteries, pas de verrouillage de l'interface utilisateur.

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

Utilisation : il suffit de placer ceci à l'intérieur de votre code qui doit attendre :

wait(1000); //wait one second

17voto

Rich Hildebrand Points 602

.Net Core semble manquer le DispatcherTimer.

Si nous sommes d'accord pour utiliser une méthode asynchrone, Task.Delay nos besoins. Cela peut également être utile si vous voulez attendre à l'intérieur d'une boucle for pour des raisons de limitation de débit.

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

Vous pouvez attendre l'achèvement de cette méthode comme suit :

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}

6voto

amitklein Points 51

La meilleure façon d'attendre sans figer votre thread principal est d'utiliser la fonction Task.Delay.

Donc votre code ressemblera à ceci

var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X