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. Que puis-je faire?
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. Que puis-je faire?
Réponses:
Est-ce qu'il fait une pause, mais vous ne voyez pas votre couleur rouge apparaître dans la cellule? Essaye ça:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
Personnellement, je pense que Thread.Sleep
c'est une mauvaise mise en œuvre. Il verrouille l'interface utilisateur, etc. J'aime personnellement les implémentations de minuterie car il attend puis se déclenche.
Usage: 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();
}
Fonction d'attente à l'aide de minuteries, pas de verrous d'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 dans votre code qui doit attendre:
wait(1000); //wait one second
L'attente occupée ne sera pas un inconvénient majeur si elle est courte. Dans mon cas, il était nécessaire de donner un retour visuel à l'utilisateur en faisant clignoter un contrôle (c'est un contrôle de graphique qui peut être copié dans le presse-papiers, qui change d'arrière-plan pendant quelques millisecondes). Cela fonctionne bien de cette façon:
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;
....
J'ai l'impression que tout ce qui n'allait pas ici était l'ordre, Selçuklu voulait que l'application attende une seconde avant de remplir la grille, donc la commande Sleep aurait dû venir avant la commande fill.
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
.Net Core semble manquer le DispatcherTimer
.
Si nous acceptons d'utiliser une méthode asynchrone, Task.Delay
répondra à nos besoins. Cela peut également être utile si vous souhaitez 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 la fin de cette méthode comme suit:
public async void TaskCaller(List<Item> items)
{
await DoTasks(items);
}
utiliser dataGridView1.Refresh();
:)
Essayez cette fonction
public void Wait(int time)
{
Thread thread = new Thread(delegate()
{
System.Threading.Thread.Sleep(time);
});
thread.Start();
while (thread.IsAlive)
Application.DoEvents();
}
Fonction d'appel
Wait(1000); // Wait for 1000ms = 1s
La meilleure façon d'attendre sans geler votre thread principal consiste à utiliser la tâche. fonction .
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);
});
Essayez peut-être ce code:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}